music-dl(1) 프로젝트를 시작하게 된 이유

2021-02-19

나는 중학생 때부터 노래듣는 걸 좋아했다.
그때는 음악파일을 다운받아 MP3에 폴더별로 정리하고 파일이름을 (가수-노래제목) 형식으로 맞춰서 정렬하는데 집착했었다.
그리고 특히 마음에 드는 곡은 앨범표지와 가사를 메타데이터로 넣어서 애착을 가지고 들었던 것 같다.

music-dl 프로젝트를 시작하게 된 이유는 내가 편하게 음악을 듣기 위해서이다. 내 유즈케이스에 잘 맞는 서비스나 솔루션이 없어서 직접 만들게 되었다.
구체적인 배경을 말하기 위해선 오래전 얘기부터 해야할 것 같다.
스마트폰이 보급화되고 음악 스트리밍 서비스가 많이 생기기 시작한 때의 얘기다. 여러 스트리밍 서비스를 써봤지만 그때마다 모두 어딘가 한가지씩은 내 마음에 들지 않았다.
최근재생한 노래 플레이리스트가 생겨서 플레이리스트가 오염된다거나, 앱의 기능이 불편하다거나, UI가 이상했다. 더 좋다고 하는 서비스를 사용해봤지만 크게 다르지 않았다.
게다가 난 듣는 노래만 계속 듣는 사용패턴을 가지고 있어서 매번 데이터를 사용해서 노래를 스트리밍하는게 낭비라고 느껴졌다.(스마트폰 사용 초창기에는 사용할 수 있는 데이터가 아주 적었다)
30일동안 재생가능한 음악을 디바이스에 저장하는 방법도 있었지만 서비스를 옮기면 그동안 들었던 노래들이 사라지는, 임시파일이라는 느낌이 들어 선호하지 않았다.
서비스를 옮길 때마다 플레이리스트를 다시 새로 만들고 노래를 하나하나 추가해야한다는 점도 불편했다. (Naver Vibe에 이 작업을 자동으로 해주는 기능이 있긴 하다)

하지만 거대한 데이터베이스에서 고음질의 노래를 들을 수 있다는 장점을 포기할 수 없어서 스트리밍 이용권 대신 다운로드 이용권을 결제하는 것으로 타협을 봤다.
다운받은 음악을 스마트폰에 옮기고, 뮤직플레이어에서 듣는 패턴을 반복하던 중 유튜브에서 내 취향의 음악을 발견했다.
유튜브에서 듣는 음악은 주로 커버곡, 직접 작곡한 연주곡, 많이 알려지지 않은 아티스트의 음악들이었다. 지금이야 유튜브에서 활동하는 아티스트들이 Apple music, Spotify, SoundCloud 링크를 걸어놓는게 당연시됐지만 그 당시에는 아니었다. youtube의 플레이리스트 기능을 이용해서 음악을 들었는데 내가 좋아하던 음악이 어느날 갑자기 삭제되는 경우에 어떤 영상이 삭제되었는지 알 수 없는채로 플레이리스트에서는 [삭제된 동영상입니다] 라는 화면만 보이는게 신경이 쓰였다. 그래서 youtube downloader 사이트나 프로그램을 이용해 영상에서 소리를 추출해서 듣는 방법을 생각했다. 하지만 속도가 너무 느리거나, 플레이리스트에 포함되는 영상의 개수 제한이 있거나, 하는 등 제약이 많았다.
그러다가 youtube-dl을 알게 되었다. youtube-dl은 유튜브 영상을 다운로드할 수 있게 해주는 파이썬 라이브러리다. 음악파일기반의 유즈케이스를 가지는 나에게는 보자마자 딱 맞는 솔루션이라는 생각이 들었다. 게다가 프로그래밍할 수 있는 무언가를 만드는게 재밌어 보였다.

프로젝트 개요
youtube-dl과 쉘스크립트를 이용하면 유튜브 플레이리스트의 URL을 전달해 영상에서 소리만 추출해서 다운로드할 수 있다.
그리고 반복작업을 하기 위해 crontab에 스크립트와 실행 주기를 설정한다.
예를들면 매일 새벽 1시에 내가 지정한 유튜브 플레이리스트에서 영상을 조회하고, 새로 추가된 영상이면 다운로드 받는 식이다.

iOS에서는 FTP를 지원하는 음악 플레이어 앱을 사용해 서버에 연결하고 음악을 듣는다.
유튜브에서 듣고싶은 음악이 있으면 플레이리스트에 추가한다. 그러면 다음날 새벽 1시에 자동으로 다운로드가 되고, 음악 플레이어에서 들을 수 있게 된다.
다음날까지 기다리기 싫고 지금 바로 듣고싶으면 ssh로 접속해 스크립트를 실행한다.

한동안 이 방법에 매우 만족하며 잘 사용해왔다. 하지만 불편한 점은 여전히 있었다.

youtube-dl이 제공하는 옵션으로 플레이리스트에 새로 추가된 영상만 다운로드하는 기능에 의존하게 되었다.
youtube-dl --download-archive FILE 옵션은 FILE에 다운로드된 videoID를 저장해서 중복해서 다운로드하지 않게 하는 기능이다.
이 방법은 새로운 플레이리스트를 추가할때 불편함이 있었다. 플레이리스트의 URL을 저장하는 파일에 새로 한줄을 추가해야하고, 음악이 저장될 폴더를 새로생성해야하고, 거기에 archive할 FILE까지 생성하는 과정은 문제가 있어 보였다.
에러를 처리하는데에도 문제가 있었다. 플레이리스트에 삭제된 동영상이 포함된 경우 그 영상을 다운받으려 시도하다 에러가 나서 다운이 되지 않는 문제가 있었다. 그동안 새로 추가한 노래가 다운되지 않았는데 이 사실은 나중에 알게 되었고, 로깅과 에러 처리가 필요하다고 느꼈다. 그밖에도 플레이리스트에 추가할때는 아무 문제 없었지만 나중에 어떠한 이유로 해당 국가에서 사용할 수 없는 영상이나 로그인한 사용자만 볼 수 있는 영상이 되는 경우도 있었다.

C, C++, Swift는 손에 익은 언어였지만 상대적으로 python은 필요할 때만 사용하는 덜 능숙한 언어이고,
youtube-dl의 python 패키지와 PyMongo를 이용하면 내가 원하는 기능을 구현할 수 있겠다 싶어 python으로 개발하는 중이다.

우분투에서 재부팅을 할때마다 mongod 서비스가 문제가 생겨서 임시방편으로 해결했는데 이대로는 안되겠다 싶어 mongoDB EC2 인스턴스를 하나 만들었다.(결국 우분투에서 mongod 문제를 완벽히 해결하진 못했다.)
오랜만에 Elastic IP, Security group 을 설정했고, mongodb.conf를 수정한 뒤 root 계정을 만들어서 연결까지 끝마쳤다.