두 가지 패키지와 하나의 서버: 39개 제품의 메타데이터 CSV, 커버, 그리고 PDF
요약
이 글은 여러 스톡 플랫폼에 39개 제품을 업로드하는 과정을 자동화한 워크플로우를 소개합니다. 각 플랫폼별 요구사항에 맞는 메타데이터 CSV 생성기, 업로드 추적기, PDF 변환기, 그리고 커버/썸네일을 포함한 패키징 스크립트를 제공합니다. 이 시스템은 표준 라이브러리만으로 작동하며 효율적인 콘텐츠 배포를 가능하게 합니다.
핵심 포인트
- 플랫폼별 요구사항에 맞는 메타데이터 자동 생성 스크립트가 필수입니다.
- 업로드 추적기(`upload_tracker.py`)로 이력을 관리하여 계정 플래그 위험을 줄일 수 있습니다.
- 단순 ZIP 파일만으로는 판매가 어려우며, 커버와 썸네일을 포함한 패키징이 중요합니다.
- 전체 파이프라인은 GPU 없는 싱글 코어 서버에서도 구동 가능한 효율성을 보여줍니다.
두 가지 패키지와 하나의 서버: 39개 제품의 메타데이터 CSV, 커버 및 PDF
스톡 플랫폼에서 제가 업로드한 배치 중 하나가 거부되었을 때, 그 이유를 파악하는 데 네 시간을 소비했습니다. 단지 CSV 파일의 한 열 순서가 잘못된 것뿐이었습니다. 그것이 전부였습니다. 저는 39개 제품을 생성하고, 압축했으며, 문서를 작성했고, 배치는 헤더 행에서 실패했습니다.
그 거부 경험은 제가 구축하는 방식을 바꾸어 놓았습니다. 저는 메타데이터와 패키징을 지루한 나중에 처리할 일로 취급하는 것을 멈추고, 새벽 1시에 제 주의력에 의존하기보다 규칙을 강제하는 스크립트를 작성했습니다. 실제로 중요한 것은 다음과 같습니다.
세 개의 플랫폼, 세 개의 헤더, 자비 없음
Adobe는 다섯 개의 열을 원합니다. Vecteezy는 네 개를 원하고, Dreamstime은 열다섯 개를 원합니다. 하나라도 잘못되면 사람이 당신의 아트를 보기 전에 파일 전체가 반송됩니다. 저는 각 플랫폼이 요구하는 정확한 헤더와 그 외 아무것도 쓰지 않는 스크립트인 make_metadata.py를 만들었습니다. 폴더를 지정하기만 하면 됩니다:
python make_metadata.py ./my-assets --platform adobe --out metadata.csv --ext .jpg
이것은 파일 이름을 제목 케이스(title-case)로 변환하여 첫 번째 통과 기준으로 사용합니다. 건조한 테스트 실행에는 괜찮지만, 제출용으로는 적합하지 않습니다. 실제 제목과 키워드를 제공하려면 --titles titles.json을 전달하세요. 스크립트는 추측하지 않고, 열을 작성합니다.
이것 하나와 트래커만 사용한다면 설치가 전혀 필요 없습니다. 표준 라이브러리만으로 충분합니다.
기억력보다 나은 원장(Ledger)
계정을 플래그 지정당하는 가장 빠른 방법은 배치를 두 번 실행하는 것입니다. 저는 한 번 거의 성공할 뻔했습니다. 861개의 파일이었고, 충돌 후 재실행된 것이었으며, 저를 멈춘 것은 그저 직감뿐이었습니다. 그 이후로 저는 upload_tracker.py를 작성했습니다. 이것은 당신이 게시한 것을 기억합니다:
python upload_tracker.py pending items.txt # 아직 완료되지 않은 항목
python upload_tracker.py done
콘텐츠는 있습니다. 그것을 구매할 가치가 있는 것처럼 보이게 만들어야 합니다. `md2pdf.py`는 마크다운 파일(Markdown file)을 제목, 표, 목록 및 링크가 포함된 깔끔하게 스타일링된 PDF로 변환합니다:
python md2pdf.py content.md product.pdf "My Product Title"
## 패키징: ZIP 파일만으로는 판매할 수 없다 (a zip alone does not sell)
`pack_product.py`는 파일을 압축(zip)하고 두 개의 이미지를 렌더링합니다: 1280×720 크기의 커버와 600×600 크기의 썸네일입니다.
python pack_product.py my-product "My Product" "A short subtitle" 9
이 스크립트를 실행하는 위치 옆에 있는 `_system` 폴더에 ZIP 파일, 커버, 썸네일을 작성합니다. `--dir` 또는 `PACK_ROOT` 환경 변수를 사용하여 다른 곳을 지정할 수 있습니다. 스크립트 수정은 필요 없습니다.
이것이 전체 의존성 이야기입니다: 네 개의 스크립트에 걸쳐 있는 두 개의 서드파티 패키지입니다. 커버는 Pillow를, PDF는 reportlab을 사용합니다. 그 외에는 아무것도 없습니다.
## 1 vCPU와 2 GB RAM으로 실행되다
전체 파이프라인은 GPU가 없는 싱글 코어 서버에서 39개의 제품, 856 MB의 출력을 생성했습니다. 이것이 작동하는 이유는 하드웨어가 아니라 다섯 가지 습관 덕분입니다:
- **한 번에 하나의 프로세스.** 단일 코어 장치에서는 이미지 작업을 절대 병렬로 분산시키지 마십시오 (Never fan out image jobs in parallel on a one-core box).
- **항목 간 메모리 해제.** 각 에셋 처리 후 `gc.collect()`를 실행합니다.
- **평균이 아닌 최대 RSS 측정.** `resource.getrusage(RUSAGE_SELF).ru_maxrss`가 실제 한계치를 알려줍니다.
- **무거운 렌더링 단계마다 서브프로세스당 하나의 파일**을 사용하여 메모리가 OS로 반환되게 합니다.
- **필요한 해상도에서 렌더링.** 60 dpi에서 미리보기를 검사하는 것이 300 dpi로 렌더링하는 것보다 좋습니다.
폴더 레이아웃도 중요합니다. `assets/`, `output/`, `packs/`, `research/`, `scripts/`는 분리하여 유지하십시오. 그리고 `research/`는 영원히 보관하십시오. 저는 한때 "정리"하기 위해 스크랩 로그를 삭제한 적이 있습니다. 그것들은 다음 세 제품의 원자재였습니다. 다시는 그런 실수를 반복하지 않겠습니다.
## 이것이 어디서 왔는가 (What this came from)
이 네 개의 스크립트는 더 큰 파이프라인 아래에 놓여 있습니다: 부모 프로젝트에는 약 19,000줄의 코드가 있으며, 이 스크립트들이 적용하는 규칙 뒤에는 300페이지 이상의 연구 자료가 담겨 있습니다. 이 도구들은 제가 판매하는 모든 것의 패키징 계층입니다.
저는 그것들을 **규정 준수 메타데이터 키트(compliance metadata kit)**로 패키징했습니다. 여기에는 네 개의 작동 스크립트, 폴더 구조, 그리고 위에 언급된 RAM 노트가 포함되어 있습니다. 단순히 "이렇게 하는 방법입니다"에서 끝나는 튜토리얼이 아닙니다. 이 도구들은 2GB 서버에 39개 제품을 배포했던 것과 동일합니다.
만약 거부된 CSV 열 때문에 하루를 날린 적이 있다면, 여기서부터 시작하세요.
[규정 준수 메타데이터 키트 받기](https://revanzart-shop.revanzart.workers.dev/go/compliance-metadata-kit?src=devto)
_디지털 제품을 제작하고 계신가요? [디지털 제품 판매자를 위한 무료 가이드 및 키트](https://revanzart-shop.revanzart.workers.dev/guides)._
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기