Playlist → MP3: 파이썬 데스크톱 앱, 설치까지 만들기
개발

Playlist → MP3: 파이썬 데스크톱 앱, 설치까지 만들기

작성일: 2026년 07월 04일0
유튜브 플레이리스트를 MP3로 바꿔 저장하는 작은 데스크톱 앱을 혼자 만들었습니다. 기능 자체는 단순하지만, 웹만 만들던 사람이 파이썬 GUI 앱을 세 OS(macOS·Windows·Linux)에서 돌아가게 하고, 남이 명령어 한 줄로 설치할 수 있게 만드는 과정에서 배운 게 더 많았습니다. 이 글은 그 기록입니다.

1. 왜 데스크톱 앱으로 만들었나

평소 만들던 건 대부분 웹입니다. 이번엔 브라우저가 아니라 내 컴퓨터에서 파일을 직접 다루는 도구가 필요했고, 그래서 파이썬 데스크톱 앱으로 방향을 잡았습니다.

  • GUI: PySide6(Qt) : 크로스 플랫폼 GUI 프레임워크. 하나의 코드로 세 OS에서 같은 창을 띄울 수 있습니다.
  • 다운로드: yt-dlp : 항목별 오디오를 받아옵니다.
  • 태그·앨범아트: mutagen : 받은 MP3에 아티스트·제목·앨범아트를 파일 메타데이터로 넣습니다.
  • 결과물은 가수 - 제목.mp3 형태로 저장되고, 저장 폴더에 받은 기록을 남겨 같은 목록을 다시 돌려도 새 곡만 받습니다.

    2. 문제 1: 배포가 제일 어렵다

    앱을 만드는 것보다 남이 설치하게 만드는 게 더 어려웠습니다. 파이썬 앱은 보통 이렇게 안내합니다: 파이썬을 설치하고, 가상환경을 만들고, 의존성을 깔고, 스크립트를 실행하세요. 개발자가 아니면 여기서 대부분 포기합니다.

  • 해결: uv 기반 원클릭 설치 : 설치 스크립트(install.sh / install.ps1) 한 줄을 터미널에 붙여넣으면 uv 설치부터 앱 설치까지 끝나도록 만들었습니다. 이후 실행은 playlist-to-mp3 한 단어, 업데이트는 uv tool upgrade 한 줄입니다.
  • 삽질 기록 : 처음엔 macOS용 .app 번들(PyInstaller)만 생각했는데, 미서명 앱이라 첫 실행에 "확인되지 않은 개발자" 경고가 뜨고 Windows·Linux는 따로 챙겨야 했습니다. OS별로 각각 패키징하는 대신 uv tool install 하나로 세 OS를 같은 방식으로 설치하도록 재정비했습니다. .app 번들은 더블클릭 아이콘이 필요한 사람을 위한 선택지로만 남겼습니다.
  • 만드는 것까지가 아니라 설치까지가 제품이라는 걸 이 단계에서 체감했습니다.

    3. 문제 2: ffmpeg를 어떻게 딸려 보내나

    오디오 변환에는 ffmpeg가 필요한데, 이걸 사용자가 직접 깔게 하면 또 하나의 진입장벽이 됩니다. 그렇다고 무겁게 앱에 통째로 넣기도 부담스럽습니다.

  • 해결: 있으면 쓰고, 없으면 알아서 해결 : 실행 시 시스템 PATH에 ffmpeg/ffprobe가 있으면 그대로 사용합니다. 없을 때는 Windows·Linux는 첫 실행에 정적 빌드를 자동으로 내려받아 캐시에 설치하고, macOS는 brew install ffmpeg를 시도합니다.
  • 효과 : 사용자는 ffmpeg의 존재 자체를 몰라도 됩니다. 준비 과정을 앱이 대신 판단하도록 만든 것이 핵심입니다.
  • 4. 문제 3: 받는 동안 창이 멈추면 안 된다

    다운로드는 시간이 걸리는 작업입니다. 이걸 화면을 그리는 메인 스레드에서 그냥 실행하면 창이 멈춘 것처럼 보이고, 진행 상황도 보이지 않습니다.

  • 해결: 별도 스레드 + Qt 시그널 : 다운로드 작업은 별도 스레드에서 돌리고, 진행률과 로그는 Qt 시그널로 UI에 전달했습니다. 받는 중에도 창은 반응하고, 어디까지 됐는지 실시간으로 보입니다.
  • 유튜브에서 오디오를 안정적으로 받기 위해 player client 설정을 조정한 부분도 있는데, 이건 외부 환경 변화를 타는 영역이라 코드에 주석으로 이유를 남겨 뒀습니다.
  • 5. UI: 이왕이면 보기 좋게

    혼자 쓸 도구라도 창은 매일 보게 됩니다. 그래서 UI에도 시간을 들였습니다.

  • 라이트·다크 모드
  • macOS 네이티브 타이틀바와 통합한 창, 그리고 테두리 없는(frameless) 반투명 스타일
  • Pretendard 폰트 번들
  • 디자인을 해봤던 경험 덕분에 이 과정이 부담이 아니라 오히려 재미있는 마무리였습니다.

    6. 정리

  • 한 일 : 유튜브 플레이리스트를 태그·앨범아트가 담긴 MP3로 저장하는 크로스 OS 데스크톱 GUI 앱을 1인으로 기획·개발·배포.
  • 스택 : Python · PySide6(Qt) · yt-dlp · mutagen · uv 배포.
  • 배운 것 : 앱의 완성도는 기능만이 아니라 설치·의존성·대기 경험에서 갈린다는 것. 사용자가 몰라도 되는 준비 과정을 앱이 대신 판단하도록 만드는 게 곧 완성도였습니다.
  • 코드는 GitHub에 공개해 두었습니다.