본문으로 바로가기

smpl to m3u

category 컴퓨터/파이썬(Python) 2021. 12. 31. 16:15

나는 스트리밍 서비스를 사용하지 않는다.

직접 스마트폰에 음원을 넣어서 듣는다.

듣는 것만 들을거니까.

 

갤럭시 S21 울트라를 구입하고 나서 음악 재생 앱으로 삼성 뮤직(Samsung Music)을 사용했다.

대기업 이름이 붙은 프로그램은 별로일 것이라는 생각이 우선 들었지만 막상 써본 결과 군더더기가 없었다.

스킨이 필요하다고 생각이 들지 않을 정도로 디자인도 준수했고 인터페이스도 깔끔했다.

내가 PC에서 듣던 음원을 그대로 스마트폰에 모두 옮겨서 리스트를 일일이 생성하고 잘 듣고 다녔다.

이제는 PC보다 스마트폰으로 음원을 즐기는 일이 메인이 되었다.

사람은 역시 편한쪽으로 익숙해지기 마련.

초반에는 스마트폰에 음원이나 리스트를 추가/삭제/편집을 하면

PC에도 똑같이 수작업으로 동기화를 시켰으나 이것도 하루이틀이지.

가끔씩 하는 일인데도 귀찮아서 안하게 되었다.

파일 옮기는 건 별 문제가 안되지만 플레이리스트가 문제였다.

삼성 뮤직 앱은 smpl이라는 자체 파일형식을 사용하는데 막상 까보면 JSON 형식이다.

이거 단순히 파싱해서 파일 정보 불러와서 m3u 형식으로 출력하면 되겠지 생각했는데

약간의 난관이 있었다. 앱이 smpl이라는 파일을 생성하는 방식이 문제인데.

파일 출력할 때 파일을 다시 쓰면 될 일을 가지고 덧씌우는 형식이었다.

플레이리스트를 최초 생성하는 건 문제가 안되나 존재하는 플레이리스트에서

노래를 추가, 삭제 해버리면 내가 생각했던 형식과 안맞게 되는 경우가 있다.

게다가 order(노래의 순번)에 해당하는 key값이 배열의 index 처럼 일정하게 증가해야 맞는 것일텐데

0부터 일정하게 증가하는 게 있는 파일이 대부분이고 가끔씩 1부터 시작하는 파일,

중간중간에 숫자가 비는 파일이 있는 경우가 있었다.

뭐 이거야 해결했으니 다행인데 왜 이렇게 파일을 생성하게 해놨는지 이해가 안되는 건 여전해서...

 

어쨌든 임시로 소스 짜놨는데 쓸사람이 있을랑가 모르것다.

import eyed3
import json
import os

eyed3.log.setLevel("ERROR")
s = '/storage/emulated/0/Music/'
filelist = os.listdir()
smpllist = [ file for file in filelist if file.endswith('.smpl') ]
for smpl in smpllist :
	print('파일 열기 완료: {}'.format(smpl))
	file = open(smpl, 'r', encoding = 'UTF-8')
	a = file.read()
	file.close()
	print('파일 닫기 완료: {}'.format(smpl))
	filename = smpl[:-5]
	b = {}
	jo = json.loads(a)
	for k in jo['members'] :
		path = k['info'][len(s):]
		order = k['order']
		b[order] = path
	output = open('{}.m3u'.format(filename), 'w', encoding = 'UTF-8')
	output.write('#EXTM3U\n')
	for k, v in sorted(b.items()) :
		mp3file = eyed3.load(v)
		sec = round(mp3file.info.time_secs)
		title = mp3file.tag.title
		artist = mp3file.tag.artist
		#print('#EXTINF:{},{} - {}'.format(sec, title, artist))
		#print('{}'.format(v))
		output.write('#EXTINF:{},{} - {}\n'.format(sec, title, artist))
		output.write('{}\n'.format(v))
		if not os.path.isfile(v) :
			print('에러: 아래 파일이 존재하지 않습니다.')
			print('SMPL: {}.smpl'.format(filename))
			print('M3U : {}.m3u'.format(filename))
			print('FILE: {}\n\n\n'.format(v))
	output.close()
	print('파일 쓰기 완료: {}.m3u\n'.format(filename))

 

일단 잠재적인 오류가 있으니 나중에 업뎃하던가.

귀찮으면 약간의 노가다를 해서 파일을 정리한 후 쓰던가 하면 된다.

 

삼성 뮤직 앱이 smpl 파일을 생성하는데 생기는 현재의 문제점

 

1) 기존에 존재하는 플레이리스트를 추가/삭제하고 나서 내보내기를 하면 문제가 생긴다.

플레이리스트의 내용을 덮어 씌우는 형태로 출력하는데 기존에 존재하던 파일의 내용이 짧으면

덮어씌울 때 문제가 없다.(JSON 파싱에 문제가 없음)

반대인 경우는 제대로 된 내용의 뒷부분에 이상한 값들이 추가로 붙기 때문에 파싱에 문제가 생긴다.

이건 문자열을 읽어오고 나서 "version":1}이라는 내용 뒤를

슬라이싱하면 문제인데 귀찮아서 소스 나중에 수정하기로...

 

2) 1번의 원인 제공을 한 경우 order의 번호가 들쭉날쭉 하게 된다.

이는 ordered dict를 사용해서 key 값을 불러오면 되기 때문에 큰 문제는 아니다.

 

3) m3u 파일을 생성하긴 했는데 음악 재생 프로그램(내가 사용하는 건 제트오디오)에서

못불러오는 경우가 생긴다. 팟플레이어에 강제로 리스트를 불러와서 재생시켜보면 잘 되는데.

왜이러지.

 

일단 뭐 어설프게라도 돌아가니 걍 써야지.