92곡을 순서대로 넣는 일이 이렇게 어려웠다니|유튜브 업로더·캡컷 빌더 정렬 기능 개선기
앨범 하나를 영상으로 만들 때는 곡 순서를 맞추는 일이 크게 어렵지 않았습니다. 열 곡 남짓한 음원을 순서대로 넣고, 어긋난 곡 한두 개를 옮기면 됐습니다.
그런데 여러 앨범의 음악을 모아 긴 플레이리스트를 준비하면서 상황이 달라졌습니다. 이번에 정리한 폴더에는 92곡이 들어 있었습니다. 파일 이름에도 A01부터 I10까지 묶음과 번호를 붙여 두었습니다. 이 정도면 프로그램에 넣는 일은 간단할 줄 알았습니다.
막상 파일을 한꺼번에 끌어다 놓으니, 제가 의도한 순서와 다르게 들어왔습니다. 정리해 둔 파일 이름이 있어도 프로그램이 그 순서대로 받아 주지 않으면 소용이 없었습니다.
이번 글은 이 불편에서 시작한 유튜브 플레이리스트 곡 순서 정렬 이야기입니다. 직접 사용하는 유튜브 업로더와 캡컷 플레이리스트 빌더에 같은 정렬 기능을 넣고, 화면에서 정한 순서가 실제 결과까지 이어지도록 바꾼 과정을 정리했습니다.
92곡을 한 칸씩 옮길 수는 없었습니다
기존 곡 목록은 파일 이름 한 줄만 보이는 단순한 형태였습니다. 추가된 순서대로 목록이 쌓였고, 순서를 바꾸려면 곡을 선택한 뒤 ‘위로’나 ‘아래로’ 버튼을 눌러야 했습니다.

열 곡일 때는 별문제가 없었습니다. 하지만 92곡이 되니 같은 방식으로 작업하기 어려웠습니다. 아래쪽에 들어간 곡 하나를 위로 올리려면 버튼을 여러 번 눌러야 했고, 중간에 다른 곡까지 잘못 옮기지 않았는지도 확인해야 했습니다.
곡 순서는 단순히 목록을 보기 좋게 만드는 문제가 아니었습니다. 유튜브 업로더는 음원 목록을 바탕으로 챕터 타임라인을 만들고, 캡컷 빌더는 목록 순서대로 음원을 배치합니다. 영상의 실제 곡 순서와 챕터 생성에 쓴 목록이 다르면 제목과 시작 시간이 맞지 않을 수 있습니다.
몇 시간이 넘는 영상에서 이런 문제가 생기면 확인하는 데도 시간이 걸립니다. 긴 플레이리스트를 계속 만들려면 곡 수가 늘어나도 감당할 수 있는 방식이 필요했습니다.
제가 원한 것은 복잡하지 않았습니다. 파일 이름으로 한 번에 정렬하고, 필요한 곡만 손으로 조금 옮긴 다음, 그 순서 그대로 결과물을 만드는 것이었습니다.
유튜브 플레이리스트 곡 순서 정렬, 목록부터 바꿨습니다

두 프로그램의 곡 목록을 표 형태로 바꿨습니다. 번호와 파일 이름뿐 아니라 곡 길이, 수정한 날짜, 만든 날짜, 파일 크기도 함께 보이도록 했습니다.
열 제목을 클릭하면 해당 기준으로 정렬되고, 다시 클릭하면 오름차순과 내림차순이 바뀝니다. 현재 정렬 기준과 방향은 열 제목 옆의 ▲▼ 표시로 확인할 수 있습니다.
목록 아래에는 곡 수와 정렬 상태를 보여 주는 줄도 넣었습니다.
92곡 · 총 5:01:15 · 정렬: 파일명 ▲
이제는 목록을 보면서 곡 수와 전체 재생 시간을 함께 확인할 수 있습니다. 긴 영상을 준비할 때는 순서만큼 전체 길이도 중요하기 때문에, 이 정보가 한곳에 보이는 것이 편했습니다.
자동 정렬 후에 직접 순서를 다듬는 기능도 남겼습니다. 여러 곡을 선택해 위나 아래로 옮기고, 맨 위나 맨 아래로 보낼 수 있게 했습니다. Delete 키로 목록에서 제외하거나 Alt+방향키로 이동하는 기능도 함께 넣었습니다.
제가 원한 곡 순서 정렬 방식은 복잡하지 않았습니다. 파일 이름으로 한 번에 정렬하고, 필요한 곡만 손으로 조금 옮긴 다음, 그 순서 그대로 결과물을 만드는 것이었습니다.
A2 다음에 A10이 오도록
파일 이름을 기준으로 곡 순서 정렬을 할 때도 생각할 부분이 있었습니다. 숫자가 포함된 이름을 글자 그대로 비교하면 A1, A10, A2처럼 사람이 기대하는 것과 다른 순서가 나올 수 있습니다.
그래서 이름에 들어 있는 숫자 부분을 숫자로 비교하는 ‘자연 정렬’을 적용했습니다. A2, A3, A10 순서로 읽도록 하는 방식입니다. 대문자와 소문자가 섞여 있어도 정렬에 불필요한 차이가 생기지 않도록 했습니다.
이번 폴더처럼 A01, A02로 자릿수를 맞춰 두면 이름순 관리가 수월합니다. 다만 다른 작업에서는 한 자리 번호가 섞일 수도 있으니, 프로그램에서도 그 경우를 처리하도록 했습니다.
폴더를 통째로 불러올 때는 파일 이름 오름차순으로 시작하도록 했습니다. 미리 붙여 둔 묶음과 번호가 프로그램에서도 그대로 이어지게 만들고 싶었습니다.
물론 이름순이 곧 가장 좋은 감상 순서라는 뜻은 아닙니다. 이름순은 제가 정리해 둔 순서를 정확히 불러오는 기준이고, 그다음의 음악적 판단은 직접 해야 합니다.
‘만든 날짜’가 곡을 만든 순서는 아니었습니다
날짜 정렬도 추가했습니다. 최근에 작업한 파일을 찾거나, 작업 흐름을 되짚고 싶을 때 쓸 수 있기 때문입니다.
다만 ‘만든 날짜’라는 이름을 그대로 믿기는 어려웠습니다. 파일을 복사하거나 다운로드하는 과정에서 생성 시각이 새로 기록될 수 있어, 음악을 처음 만든 시점과 현재 파일의 만든 날짜가 다를 수 있습니다.
수정한 날짜가 이전 정보를 유지하는 경우도 있지만, 이 역시 복사 도구나 저장 방식에 따라 달라집니다. 음원을 편집하고 다시 저장했다면 수정한 날짜도 바뀝니다. 두 날짜 중 어느 하나가 실제 제작 순서를 항상 보장하는 것은 아니었습니다.
그래서 목록에는 두 날짜를 모두 남겼습니다. 날짜는 파일을 찾고 비교하는 보조 기준으로 쓰고, 최종 곡 순서는 파일 이름과 제가 확인한 목록을 기준으로 정하기로 했습니다.
파일 복사 방식에 따라 날짜 정보가 어떻게 보존되는지는 Python 공식 문서의 파일 복사 설명에서도 확인할 수 있습니다.
이 기능을 넣으면서 오히려 분명해진 점이 있습니다. 정렬 기준이 많아지는 것보다, 각 기준이 무엇을 의미하는지 알고 사용하는 것이 더 중요했습니다.
두 프로그램에 같은 목록 모듈을 적용했습니다
이번에는 곡 순서 정렬 기능을 만드는 방식도 바꿨습니다.
유튜브 업로더와 캡컷 빌더는 하는 일이 다르지만, ‘곡 목록을 받아서 순서대로 쓴다’는 부분은 똑같습니다. 그래서 정렬되는 곡 목록을 두 프로그램에 각각 따로 만들지 않고, sortable_file_list.py라는 모 하나로 만들어 두 프로그램이 함께 쓰게 했습니다.
이 모듈은 Claude가 만들어 줬습니다. 모 파일만 건넨 게 아니라, 무엇이 바뀌는지 정리한 설명서와 두 프로그램에 적용하는 방법, 그리고 Claude Code에 그대로 붙여 넣으면 되는 요청문까지 한 묶음으로 왔습니다. 열이 여섯 개로 늘어나 창을 가로로 1,100px 정도로 키워야 한다는 안내도 있었는데, 이건 크게 고민하지 않았습니다. 목록이 한눈에 보이는 게 더 중요했으니까요.
제가 한 일은 그 요청문을 Claude Code에 붙여 넣는 것이었습니다. 실제로 쓴 요청문은 이렇습니다.
이 프로그램의 음원 파일 목록을 같은 폴더에 둔 sortable_file_list.py의 SortableFileList 위젯으로 바꿔줘.
- 지금 곡 목록을 보여 주는 위젯을 SortableFileList로 교체
- 곡 추가/폴더 불러오기는 add_files()/add_folder()를 쓰게 수정
- 목록을 읽어 영상(또는 타임라인·챕터)을 만드는 모든 곳은 get_paths()(길이가 필요하면 get_items())를 쓰게 수정
- 길이는 이 프로그램에 이미 있는 길이 계산 함수를 duration_func로 넘기고, 없으면 mutagen_duration 사용
- 창 가로 크기를 1100px 이상으로 조정
- 기존 기능(번역, 업로드, 반복 등)은 바꾸지 말고, 수정 전 파일은 _backup으로 남겨줘
수정 후 폴더를 불러와 파일명/만든 날짜/수정한 날짜 오름차순·내림차순이 되는지, 그 순서대로 결과가 나오는지 확인해줘.
코드를 모르는 사람이 보면 낯선 단어가 많지만, 한 줄씩 풀어 보면 단순합니다.
첫 줄은 무엇을 무엇으로 바꾸는지입니다. 새 모듈 파일을 프로그램 옆에 두었으니, 원래 곡 목록 자리에 그걸 끼워 넣으라는 뜻입니다.
add_files(), add_folder() 줄은 곡이 들어오는 입구를 바꾸라는 겁니다. 파일 추가 버튼으로 넣든, 끌어다 놓든, 폴더째 불러오든 모두 새 모을 거치게 해야 정렬과 중복 제외가 제대로 됩니다.
get_paths() 줄이 제일 중요합니다. 이건 곡이 나가는 출구입니다. 챕터를 만들거나 캡컷 타임라인에 음원을 까는 곳이 모두 ‘지금 화면에 보이는 순서’를 읽어 가게 하라는 뜻입니다. 이 줄을 빠뜨리면 화면은 정렬돼 있는데 결과물은 옛날 순서로 나오는 일이 생깁니다. 요청문이 “모든 곳”이라고 굳이 못 박아 둔 이유가 여기 있습니다.
길이 계산 줄은 이미 있는 걸 다시 만들지 말라는 뜻입니다. 유튜브 업로더는 원래 ffprobe로 곡 길이를 재고 있었기 때문에, 그 함수를 그대로 쓰게 했습니다. 두 프로그램이 같은 곡을 서로 다른 길이로 계산하면 곤란하니까요.
마지막 두 줄은 안전장치입니다. 기존 기능은 건드리지 말 것, 그리고 고치기 전 파일을 백업으로 남길 것. 끝에는 무엇으로 확인할지까지 적혀 있습니다. 고쳤다고 끝이 아니라, 정렬이 실제 결과에 반영되는지까지 Claude Code가 직접 확인하고 돌아오게 하는 문장입니다.
처음 받았을 때는 그냥 붙여 넣으면 되는 문장으로만 봤는데, 글을 쓰려고 한 줄씩 다시 읽어 보니 각 줄이 다 이유가 있었습니다. AI에게 AI가 일을 넘기는 요청문이지만, 사람이 다른 사람에게 일을 맡길 때 챙겨야 할 것과 크게 다르지 않았습니다. 무엇을 바꾸는지, 어디까지 바꾸는지, 무엇은 건드리지 말아야 하는지, 끝나면 무엇으로 확인하는지.
같은 요청문을 두 프로그램 폴더에서 각각 실행했고, 두 프로그램 모두 같은 날 바뀌었습니다. 수정 전 파일은 gui_app_v1.12_backup.py, gui_app_v1.6_backup.py라는 이름으로 남아 있습니다.
도구가 여러 개가 되고 나서 배운 게 있습니다. 같은 일을 프로그램마다 조금씩 다르게 처리하고 있으면, 그게 나중에 꼭 문제가 된다는 것입니다. 번역 언어 목록이 프로그램마다 달라서 한 번 통일 작업을 했던 적도 있습니다. 이번에는 처음부터 하나로 만들었으니, 나중에 정렬 방식을 고치고 싶어지면 모 하나만 고치면 됩니다.
화면에 보이는 순서와 결과에 쓰이는 순서
확인을 쉽게 하려고 목록 모듈만 따로 실행하는 데모 창도 만들었습니다. 전체 프로그램을 실행하지 않아도 파일을 넣고 정렬을 확인할 수 있는 화면입니다.
92곡 폴더를 불러와 A01부터 I10까지 순서대로 나타나는지 확인했습니다. 파일 이름을 내림차순으로 바꿨을 때는 반대로 표시되는지 살폈습니다. ‘현재 순서 출력’으로 전달되는 목록도 화면과 비교했습니다.
이 데모에서 확인할 수 있는 것은 목록 모의 동작입니다. 실제 챕터와 캡컷 타임라인에 같은 순서가 반영되는지는 각 프로그램에서도 따로 확인해야 합니다. 요청문에 결과 확인까지 넣은 이유도 여기에 있습니다.
예전에 챕터 입력창에서 고친 내용이 실제 업로드에 반영되지 않던 버그를 겪은 적이 있습니다. 화면에서 수정했다는 사실과 프로그램이 그 값을 사용한다는 사실이 다를 수 있다는 것을 그때 배웠습니다.
이번 유튜브 플레이리스트 곡 순서 정렬에서도 기준은 같았습니다. 목록이 원하는 순서로 보이는지, 그리고 그 순서가 결과를 만드는 단계까지 이어지는지를 함께 살피는 것입니다.

공통으로 만들되, 관리할 부분은 남았습니다
같은 요청문을 두 프로그램 폴더에서 각각 실행했습니다. 수정 전 파일도 gui_app_v1.12_backup.py, gui_app_v1.6_backup.py로 남겨 두었습니다.
여러 도구를 쓰다 보니 같은 일을 프로그램마다 조금씩 다르게 처리하는 것이 나중에는 불편으로 돌아오기도 했습니다. 번역 언어 목록이 서로 달라 통일했던 경험도 있습니다.
이번에는 곡 목록을 다루는 방식을 같은 모듈으로 맞췄습니다. 덕분에 정렬 규칙을 고칠 때도 같은 코드를 기준으로 관리할 수 있게 됐습니다. 다만 모듈 파일을 각 프로그램 폴더에 따로 두는 구조라면, 수정한 파일을 양쪽에 반영하는 일은 여전히 필요합니다.
같은 모을 사용한다는 것과 한 번 수정하면 모든 프로그램에 자동으로 적용된다는 것은 구분해야 했습니다. 이번 작업은 우선 기능과 기준을 통일했다는 데 의미가 있습니다.
곡 순서 정렬로 줄인 반복 작업
곡 순서 정렬은 눈에 띄는 기능은 아닙니다. 하지만 열 곡을 다룰 때와 92곡을 다룰 때는 체감이 달랐습니다. 파일을 한 칸씩 옮기던 작업이 줄어들면서, 음악의 흐름을 살피는 데 더 집중할 수 있었습니다.
긴 플레이리스트를 준비할수록 곡을 넣는 일보다, 곡 사이의 분위기와 흐름을 살피는 데 시간을 쓰고 싶었습니다. 미리 정한 순서를 다시 맞추는 작업이 그 시간을 차지하지 않았으면 했습니다.
이번 개선으로 파일 이름순으로 기본 목록을 만들고, 필요한 곡만 직접 옮기는 방식이 가능해졌습니다. 자동화 도구도 실제 작업량이 늘어나는 과정에서 조금씩 손볼 곳이 드러난다는 것을 다시 느꼈습니다.
같은 날 캡컷 빌더에는 배경 이미지를 여러 장 넣고 곡 구간에 맞춰 바꾸는 기능도 추가했습니다. 다음 글에서는 긴 플레이리스트의 배경을 어떻게 구성하고 프로그램에 반영했는지 이어서 소개하겠습니다.
Rain on Porcelain에서 더 알아보기
구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.