삼성 뮤직 플레이리스트 변환하기

THXX·2023년 9월 27일
0

나는 앨범을 구매하거나 디지털 음원을 구매해서 음악 파일을 오프라인에 저장하는 편이다. 따라서 오프라인 파일 경로가 들어 있는 플레이리스트를 여러모로 활용해야 한다.

컴퓨터에서는 AIMP라는 프로그램을 사용하여 음악을 듣는 편이다. 핸드폰은 갤럭시이므로 삼성 뮤직을 사용한다. 문제는 무엇인가? AIMP와 삼성 뮤직 두 개 다 독자규격 플레이리스트를 사용한다는 것이다.

AIMP는 .aimppl4을, 삼성 뮤직은 .smpl 확장자를 가진 플레이리스트를 사용한다.

따라서 나의 플레이리스트를 핸드폰에 그대로 옮기고 싶다면 smpl 플레이리스트 파일로 변환해주어야 한다.

AIMP에서는 aimppl4 파일 뿐만 아니라 m3u 파일도 지원하므로 두 개의 형식에 대해서 간단히 알아보자.

#-----SUMMARY-----#
ID={59B9960B-C120-4CEB-B8F1-FB64289C6AAE}
Name=MUSE
NameIsAutoSet=0
ContentDuration=22042217
ContentFiles=88
ContentSize=2327208138
PlaybackCursor=55
PlaybackCursorAutoBookmark=0
Shuffled=0

#-----SETTINGS-----#
Flags=2047
FormatMainLine=%IF(%Artist,%Artist - %Title,%Title)
FormatSecondLine=%FileFormat :: %SampleRate, %BitRate, %FileSize
GroupFormatLine=%FileDir

#-----CONTENT-----#
-D:\Music\Western\Muse\Muse\1999) Showbiz
D:\Music\Western\Muse\Muse\1999) Showbiz\01 - Sunburn.flac|Sunburn|Muse|Showbiz|Muse|New Prog|1999|01||||916|2|44100|234600|26925259|0|1|0||||16||FLAC||
D:\Music\Western\Muse\Muse\1999) Showbiz\02 - Muscle Museum.flac|Muscle Museum|Muse|Showbiz|Muse|New Prog|1999|02||||994|2|44100|262893|32706119|0|1|1||||16||FLAC||
D:\Music\Western\Muse\Muse\1999) Showbiz\03 - Fillip.flac|Fillip|Muse|Showbiz||New Prog|1999|03||||983|2|44100|241573|29733795|0|1|2||||16||FLAC||
D:\Music\Western\Muse\Muse\1999) Showbiz\09 - Sober.flac|Sober|Muse|Showbiz||New Prog|1999|09||||986|2|44100|244227|30144032|0|1|3||||16||FLAC||
D:\Music\Western\Muse\Muse\1999) Showbiz\06 - Showbiz.flac|Showbiz|Muse|Showbiz||New Prog|1999|06||||913|2|44100|317107|36251936|0|1|4||||16||FLAC||
-D:\Music\Western\Muse\Muse\2001) Origin of Symmetry
D:\Music\Western\Muse\Muse\2001) Origin of Symmetry\01 - New Born.flac|New Born|Muse|Origin Of Symmetry||Alternative Rock|2001|01|1|||935|2|44100|363427|42554464|0|1|5||||16||FLAC||
D:\Music\Western\Muse\Muse\2001) Origin of Symmetry\02 - Bliss.flac|Bliss|Muse|Origin Of Symmetry||Alternative Rock|2001|02|1|||908|2|44100|252467|28732502|0|1|6||||16||FLAC||
D:\Music\Western\Muse\Muse\2001) Origin of Symmetry\03 - Space Dementia.flac|Space Dementia|Muse|Origin Of Symmetry||Alternative Rock|2001|03|1|||923|2|44100|380800|44022331|0|1|7||||16||FLAC||
D:\Music\Western\Muse\Muse\2001) Origin of Symmetry\04 - Hyper Music.flac|Hyper Music|Muse|Origin Of Symmetry||Alternative Rock|2001|04|1|||1045|2|44100|201373|26390449|0|1|8||||16||FLAC||
D:\Music\Western\Muse\Muse\2001) Origin of Symmetry\05 - Plug In Baby.flac|Plug In Baby|Muse|Origin Of Symmetry||Alternative Rock|2001|05|1|||1025|2|44100|219800|28227424|0|1|9||||16||FLAC||
D:\Music\Western\Muse\Muse\2001) Origin of Symmetry\06 - Citizen Erased.flac|Citizen Erased|Muse|Origin Of Symmetry||Alternative Rock|2001|06|1|||914|2|44100|439293|50270769|0|1|10||||16||FLAC||

Summary

  • ID : GUID 형식의 플레이리스트 고유 번호
  • Name : 플레이리스트의 이름
  • NameIsAutoSet : 아마도 "새 재생 목록"이라는 문자열의 Localization을 위해 남겨놓은 기록같지만 실제 확인해보니 자동으로 이름이 지어진 플레이리스트도 값이 0이다. 의미가 없는 듯 하다.
  • ContentDuration : ms단위의 전체 플레이리스트의 길이
  • ContentFiles : 플레이리스트 내 음악 개수
  • ContentSize : 바이트 단위의 플레이리스트 내 음악 파일의 용량
  • PlaybackCursor : 마지막 재생 중이던 음악의 Index
  • PlaybackCursorAutoBookmark: 모르겠다.
  • Shuffled: 플레이리스트 셔플 여부

Settings

  • Flags: 값이 2047(2^11-1)이다. 비트마스킹으로 플래그를 설정한다고 유추할 수 있지 않을까.
  • FormatMainLine, FormatSecondLine:
    아무튼 이런 식으로 플레이리스트 표기를 만들어주는 형식을 지정할 수 있는 것 같다. 각각 윗줄과 아랫줄의 포맷을 담당한다.
  • GroupFormatLine:
    현재 음악들은 폴더를 기준으로 Grouping되여 플레이리스트가 관리된다. 이 그룹을 표시하는 형식을 설정한다.

Content

  • 이제 폴더로 Grouping된 음악들의 목록들이 나온다. 절대경로로 표시되어 있으며, 정보들이 | 로 구분되어 있는 모습을 볼 수 있다.
  • 확인할 수 있는 정보는 다음과 같다.
    • 절대 경로
    • 노래 이름
    • 아티스트명
    • 앨범명
    • 장르
    • 연도
    • 트랙#
    • 비트레이트
    • 재생시간(in ms)
    • 파일 크기(in byte)
    • 음악 비트 수 (보통의 경우 16비트)
    • 확장자명
  • 더 많은 정보가 있으나 위의 정보로 충분하므로 넘어가겠다.

aimppl4의 분석이 끝났다. 이제 m3u다.

#EXTM3U
#EXTINF:234,Muse - Sunburn
D:\Music\Western\Muse\Muse\1999) Showbiz\01 - Sunburn.flac
#EXTINF:262,Muse - Muscle Museum
D:\Music\Western\Muse\Muse\1999) Showbiz\02 - Muscle Museum.flac
#EXTINF:241,Muse - Fillip
D:\Music\Western\Muse\Muse\1999) Showbiz\03 - Fillip.flac
#EXTINF:244,Muse - Sober
D:\Music\Western\Muse\Muse\1999) Showbiz\09 - Sober.flac
#EXTINF:317,Muse - Showbiz
D:\Music\Western\Muse\Muse\1999) Showbiz\06 - Showbiz.flac

아주 간단명료하다! #EXTM3U 헤더로 m3u 파일임을 인식시키고, 아래 #EXTINF 태그를 통해 각 음악의 재생시간과 음악명 정보를 추가 제공하고 그 아래에 경로를 작성한다.

사실 m3u는 다른 태그도 있지만 넘어가도록 한다. https://en.wikipedia.org/wiki/M3U 를 참조.

이제 smpl에 대해 알아봐야 한다.

{
  "members": [
    {
      "artist": "Muse",
      "info": "/storage/emulated/0/Music/Music/Western/Muse/Muse/2003) Absolution/06 - Falling Away With You.flac",
      "order": 4,
      "title": "Falling Away With You",
      "type": 65537
    },
    {
      "artist": "Muse",
      "info": "/storage/emulated/0/Music/Music/Western/Muse/Muse/2003) Absolution/02 - Apocalypse Please.flac",
      "order": 0,
      "title": "Apocalypse Please",
      "type": 65537
    }
  ],
  "name": "Muse",
  "recentlyPlayedDate": 1595185475,
  "sortBy": 4,
  "version": 1
}

확장자명만 smpl이었던 JSON 형식임을 단번에 알아차릴 수 있었다.

특징이 있다.

  • 리스트 members의 순서는 실제 플레이리스트 순서와 다르다. order로 플레이리스트 순서를 처리한다.
  • type은 65537로 고정된다.
  • sortBy를 이용하여 정렬 방식을 바꾼다.
  • recentlyPlayedDate는 Epoch Time 형식이다.

고찰: order 프로퍼티로 순서를 정한 것은 바람직한 일인가? 곡의 순서를 바꾼다고 실제 데이터의 순서를 바꾸기엔 연산 횟수에서 비효율적이다. 중간에 삽입했다고 가정하면 나머지 데이터를 전부 뒤로 미뤄야 한다. 차라리 변경된 object를 선형탐색하여 프로퍼티만 바꾸는 게 효율적일 것이다.

결국 우리가 필요한 것은 아티스트명과 경로, 음악명 딱 세 개이다.

우리가 소스파일로 사용할 플레이리스트 파일들(aimppl4,m3u)과 타겟파일로 만들어질 smpl에 대해서 분석이 완료되었다. 이제 converter를 만들 시간이다.

Python을 사용했다.

https://github.com/hjs0410hc/aimppl4tosmpl
https://github.com/hjs0410hc/smpltom3u8

옛날에 만든 허접하기 짝이 없는 스크립트들이다. 위는 aimppl4에서 smpl로, 아래는 smpl에서 m3u8(unicode m3u)로 변환하는 스크립트들이다.

인코딩 문제가 좀 있었던 것으로 기억한다. aimppl4는 utf-16 리틀 엔디안을 인코딩으로 사용하고 있었기 때문.
그리고 recentlyPlayedDate에 대해 아무렇게나 Epoch Time을 하드코딩해놨다. 굳이 정확한 값이 필요가 없었기 때문이다. 알고보니 0이어도 된다.

뭐... 제작 과정은 간단하다.
smpl에 대한 구조를 소스코드에 정립하기 위해서 Smpl_data_class라는 클래스를 만들었고, 또 aimppl4의 각 곡에 대한 정보를 읽어들이기 위해서 Track이라는 클래스를 만들었다. 준비를 마쳤기 때문에 이제 한 줄 씩 파일을 읽어서 값을 전부 채워넣었다.

이러한 스크립트를 작성하는 데에 있어 크게 문제는 없었지만 뭔가 실제 스크립트처럼 있어보이기 위해 argument parser를 이용하여 완성본을 만들어서 좀 으쓱했다. (???)

smpltom3u8은 말할 것도 없이 간단하다. 필요한 정보가 단지 경로밖에 없었기 때문이다. #EXTINF를 안 넣어줘도 AIMP에서 잘 작동했다.

~完~

profile
THXX FOR EVERYTHING

0개의 댓글