거절당하는 것을 막기 위해 메타데이터 CSV 생성기를 만들었습니다
요약
Adobe Stock 등 스톡 플랫폼의 까다로운 메타데이터 요구사항 때문에 개발자가 겪은 어려움을 해결하기 위해 네 가지 파이썬 스크립트를 제작했습니다. 이 도구들은 정확한 CSV 헤더를 생성하고, 업로드 추적을 관리하며, 제품 패키징 및 마크다운을 PDF로 변환하는 기능을 제공합니다.
핵심 포인트
- 플랫폼별 요구사항에 맞는 정확한 CSV 헤더 생성이 필수입니다.
- 업로드 트래커 스크립트를 사용해 중복 게시를 방지하고 진행 상황을 관리할 수 있습니다.
- Pillow와 reportlab 라이브러리를 활용하여 제품 패키징 및 PDF 변환이 가능합니다.
- 전체 파이프라인은 단일 vCPU, 2GB RAM 환경에서도 효율적으로 작동하도록 설계되었습니다.
거절당하는 것을 막기 위해 메타data CSV 생성기를 만들었습니다
거절 이메일은 세 단어로 되어 있었습니다: "CSV 형식이 잘못되었습니다."
저는 에셋을 업로드하는 데 4시간을 썼지만, Adobe Stock이 검증 단계에서 전체 배치를 거부했습니다. 파일 하나도 검토되지 않았습니다. 문제는 아트워크가 아니었습니다. 문제는 제 헤더 행에 Title,Keywords,Category라고 적혀 있었는데, Adobe는 Filename,Title,Keywords,Category,Releases를 원했다는 것입니다. 열이 하나만 더 있어도 전체 업로드가 시작하자마자 죽어버립니다.
그것이 제가 메타데이터를 사후 처리(afterthought)로 취급하는 것을 멈춘 순간이었습니다. 이 글은 다시는 그런 일이 일어나지 않도록 만들기 위해 제가 만든 네 가지 스크립트와, 저에게 그것들을 작성하도록 강요한 플랫폼 규칙에 대한 내용입니다.
CSV 헤더는 선택 사항이 아닙니다
모든 스톡 채널은 정확한 열 레이아웃을 강제하며, 잘못된 형태의 파일을 즉시 거부합니다. 제가 만족시켜야 했던 형식들은 다음과 같습니다:
- Adobe Stock: 5개 열
- Vecteezy: 4개 열
- Dreamstime: 15개 열
Dreamstime을 위해 15개의 열이라니. 만약 이 스프레드시트를 수동으로 편집한다면, 결국 잘못하게 될 것이고, 실패 모드는 업로드가 실행될 때까지 조용합니다. 그래서 make_metadata.py는 플랫폼이 요구하는 헤더만 작성하고 그 외에는 아무것도 쓰지 않습니다. 폴더를 지정하고 어떤 플랫폼인지 알려주기만 하면 CSV 파일을 생성해 줍니다. 또한 지루한 경우도 처리합니다: 만약 제목 파일(titles file)을 전달하지 않으면, 파일 이름을 title-case로 변환하여 사용합니다. 이것은 첫 번째 시도에는 괜찮습니다. 제출하기 전에 교체하세요. 왜냐하면 파일 이름이 곧 제목은 아니기 때문입니다.
나머지 절반은 같은 배치를 두 번 올리지 않는 것입니다. 계정이 플래그(flagged)를 받을 수 있는 가장 빠른 방법은 업로드 작업이 제대로 진행되었는지 확신하지 못해서 다시 실행하는 것입니다. upload_tracker.py는 원장(ledger)입니다. 이미 완료된 것이 무엇인지 기억하기 때문에, 재실행해도 중복 게시되지 않습니다. 이 스크립트에 pending(대기 중)을 요청하면, 이미 배송한 것(shipped)이 아니라 정확히 남은 것이 무엇인지 보여줍니다.
패키징은 제품을 제품으로 만듭니다
실제 표지(cover)가 있는 zip 파일이 판매됩니다. 표지가 없는 파일은 그렇지 않습니다. pack_product.py가 이를 묶어줍니다: 파일을 압축하고, 1280x720 크기의 표지와 600x600 크기의 썸네일을 생성합니다. 이미지 처리는 Pillow가 담당합니다. 이것이 이 단계의 전체 의존성입니다.
네 번째 스크립트인 md2pdf.py는 마크다운 파일(Markdown file)을 제목, 표, 목록, 링크 등이 온전히 유지된 스타일리시한 PDF로 변환합니다. 만약 콘텐츠가 이미 준비되어 있다면, 이 단계가 사람이 돈을 지불할 만한 것처럼 보이게 만듭니다. reportlab이 출력 처리를 담당합니다.
전체 키트에는 세 개의 외부 패키지가 사용됩니다: Pillow와 reportlab입니다. 메타데이터 및 추적기 스크립트는 표준 라이브러리만 사용하므로, 이 두 가지는 설치가 필요 없습니다.
모든 것이 2 GB 서버에서 실행됩니다
이것은 사람들이 믿지 못하는 부분입니다. 전체 파이프라인은 vCPU 1개, RAM 2 GB, GPU 없이 실행되었습니다. 데모가 아닙니다. 그 장비로 완성된 제품 39개를 패키징하고 출력물 856 MB를 생성했습니다.
이를 가능하게 하는 습관들:
- 한 번에 하나의 프로세스. 단일 코어에서 이미지 작업을 병렬로 처리하지 마십시오. 더 빨라지지 않고, 메모리 부족(out of memory)이 발생합니다.
- 항목 간 자유로운 메모리 확보. 각 에셋(asset) 처리 후
gc.collect()를 호출하십시오. - 평균 RSS가 아닌 최대 피크 RSS 측정. 평균값은 작업을 중단시킨 급증(spike)을 숨깁니다.
resource.getrusage(RUSAGE_SELF).ru_maxrss는 실제 상한선(ceiling)을 알려줍니다. - 무거운 렌더링 단계의 경우 서브프로세스당 하나의 파일을 사용하여, 메모리가 점유되는 대신 OS로 반환되게 합니다.
- 필요한 해상도에서 렌더링. 60 dpi에서 미리보기를 검사하는 것이 300 dpi에서 렌더링하고 기다리는 것보다 좋습니다.
이 네 가지 작은 도구 뒤에 얼마나 많은 규칙 적용(rule-enforcement)이 숨어 있는지 맥락을 드리자면, 상위 프로젝트는 각 플랫폼이 실제로 허용하는 것에 대한 300페이지 이상의 연구를 바탕으로 구축된 약 19,000줄의 파이프라인 코드로 이루어져 있습니다.
리서치 폴더 유지하기
가장 중요한 구조 결정은 다른 것들보다 더 중요합니다:
project/
assets/ 원시 출력물, 에셋당 하나의 파일
output/ 제출 준비 완료된 파일 + metadata.csv
...
research/ 폴더는 영원히 보존하세요. 스크랩 로그와 메모가 미래 제품의 원자재입니다. 이를 '정리'하기 위해 삭제하는 것은 이 프로젝트에서 한 번 저지른 실수이며, 다시는 반복하지 않을 것입니다. 왜냐하면 다음 제품 아이디어는 보통 당시에는 쓸모없어 보이는 노트에서 나왔기 때문입니다.
실제 내용
저는 작동하는 스크립트들을 패키징했습니다. '여기서 이렇게 할 수 있습니다'로 끝나는 튜토리얼이 아닙니다. 프레임워크나 클라우드 계정 없이 작업을 수행했던 네 가지 도구들입니다:
make_metadata.py: Adobe, Vecteezy 및 Dreamstime용 CSV 파일 생성기upload_tracker.py: 중복 게시를 방지하는 장부(ledger)md2pdf.py: Markdown을 스타일이 적용된 PDF로 변환pack_product.py: ZIP, 커버 및 썸네일 생성기
메타데이터 문제로 거절당하고 자신의 예술 작품 탓을 했던 분들에게 이것이 해결책입니다.
디지털 제품을 제작하고 계신가요? 디지털 제품 판매자를 위한 무료 가이드 및 키트.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기