본문 바로가기
공대생/무작정 해보는 파이썬

Python으로 Mp3 파일 속성 편집하기

by 흔한 공대생 2020. 4. 9.
728x90
반응형

본 포스팅은 Python을 이용하여 Mp3 파일의 속성을 편집하는 내용을 다룬다. 파이썬 3.7, 윈도우 10 기반에서 이루어졌다.


 

01. 들어가며,

Mp3 파일을 재생시키다 보면, 파일 이름이 깔끔하지 않다거나 앨범, 아티스트 등 정보가 잘못 입력되어 있는 경우가 있다. 결벽증이 있는 본인의 경우 심히 거슬리는 일이 아닐 수 없다.

또한 윈도우 내장 mp3 플레이어인 groove music의 경우 속성에 있는 정보를 읽어 앨범커버 등을 자동으로 연결시켜주는데, 이 조차도 제대로 작동하지 않게 된다.

해결을 위해 파일 속성을 편집하는 외부 프로그램을 다운로드하여 사용할 수도 있지만, 귀찮아서 직접 속성을 편집하고 있었다.

이마저도 귀찮아 편하게 속성을 편집할 수 있는 방법을 생각하다가 파이썬으로 구현해보기로 했다. 마침 eyed3이라는 좋은 툴이 있었다.


 

02. eyed3란?

eyed3는 메타데이터(노래 정보 등)가 포함된 mp3 파일 작업을 위한 도구로, 아티스트, 앨범, 타이틀, 트랙 번호 등을 지정할 수 있다.

우선적으로 필요한 정보는 아티스트, 앨범, 타이틀이므로 이 부분을 건드려보도록 하겠다.

사용법은 다음과 같다. (출처: https://eyed3.readthedocs.io/en/latest/)

import eyed3

audiofile = eyed3.load("song.mp3")
audiofile.tag.artist = "Token Entry"
audiofile.tag.album = "Free For All Comp LP"
audiofile.tag.album_artist = "Various Artists"
audiofile.tag.title = "The Edge"
audiofile.tag.track_num = 3

audiofile.tag.save()

 

mp3파일을 로드하고, tag에 다양한 정보들을 입력, 마지막으로 tag를 저장해주면 된다.

 

매번 코드를 수정해가며 속성 편집을 진행할 수는 없으니, input()으로 정보를 입력받을 수 있다. 그리고 보다 편한 작업을 위하여 tkinter를 이용하여 편집 창을 만들어보겠다.

tkinter에 대한 기초적인 내용이 궁금하다면 다음 포스팅을 참고해주세요.

https://commonengineerr.tistory.com/7

 

Python Tkinter - BMI 계산기 만들기

Tkinter 소개 일반적으로, python idle을 이용하여 코딩 후 실행시키면 명령 프롬프트 창에서 실행된다. 검은 배경에 까만 글자만 가득한 화면이 이상하다고 느낄 수도 있고, 무엇보다 사용자는 정해진 순서대로..

commonengineerr.tistory.com


 

03. tkinter 창 만들기

먼저 tkinter 창을 만들어보자.

파일 이름, 아티스트, 앨범, 타이틀의 4가지 정보를 입력받아야하고, 저장과 리셋(엔트리를 비워주는 역할)의 두 버튼이 있으면 좋겠다. 또, 저장이 잘 수행되었는지, 아니면 에러가 발생했는지를 표시해주는 엔트리도 만들어보자.

 

총 5개(프로그램 이름을 포함하여)의 라벨과 5개의 엔트리, 2개의 버튼을 만들어야 한다. 적당히 창 사이즈를 지정하고 내부에 라벨 엔트리 버튼을 배치했다.

from tkinter import *
    
window = Tk()       #윈도우 생성
window.geometry('260x300')      #창 크기 지정
window.resizable(width=False, height=False)     #창 크기 변경 못하도록 설정

#Label로 프로그램 안내하는 정보 출력, place로 위치 고정
l1 = Label(window, text = 'mp3 속성 편집', fg = 'orange', font = 'helvetica 16 bold')
l2 = Label(window, text = '파일 이름: ')
l3 = Label(window, text = '제목: ')
l4 = Label(window, text = '앨범: ')
l5 = Label(window, text = '아티스트: ')

l1.place(x=15, y=10)
l2.place(x=10, y=50)
l3.place(x=10, y=100)
l4.place(x=10, y=130)
l5.place(x=10, y=160)


#입출력 칸을 Entry로 생성, place로 위치 고정
e1 = Entry(window)
e2 = Entry(window)
e3 = Entry(window)
e4 = Entry(window)
e5 = Entry(window)

e1.place(x=75, y=50)
e2.place(x=75, y=100)
e3.place(x=75, y=130)
e4.place(x=75, y=160)
e5.place(x=75, y=250)


#정보 저장, 리셋 버튼 생성, place로 위치 고정
b1 = Button(window, text = "정보 저장")
b2 = Button(window, text = "리셋")

b1.place(x=80, y=200)
b2.place(x=180, y=200)


window.mainloop()       #실행(루프 생성)

 

04. 이벤트 처리 (본격적 속성 편집)

기본적인 틀은 다 갖추었다. 이제 버튼을 눌렀을 때 실제로 동작하도록 이벤트처리를 해주자.

저장 버튼을 눌렀을 때 해야하는 동작은 다음과 같다.

  1. 입력한 정보를 불러온다.
  2. 파일을 불러와 태그를 생성한다.
  3. eyed3를 이용해서 태그에 정보를 입력한다.
  4. 파일 이름을 재지정한다.
  5. 태그를 파일에 씌워준다.
  6. 실행 완료 문구를 표시한다.
  7. 만약 에러가 발생했을 경우, 이를 표시해준다.

 

기본적인 방법은 이전에 tkinter 포스팅에서 밝혔던 내용과 같다. 추가적으로 설명하자면 다음과 같다.

get() 함수로 엔트리의 내용을 불러와 변수에 넣어준다.

eyed3와 os 툴을 이용하여 파일을 불러오고, 태그를 생성하여 정보를 넣어준다.

에러 발생을 따져주기 위해 try except 구문을 이용한다.

 

위 내용을 소스코드로 작성하면 다음과 같다.

import os
import eyed3
from tkinter import *

def save():
    try:
        name = e1.get()
        title = e2.get()
        album = e3.get()
        artist = e4.get()
        
        tag = eyed3.load((os.getcwd())+"/"+name+".mp3")
        tag.tag.artist = artist
        tag.tag.album = album
        tag.tag.title = title

        tag.rename(title+' - '+artist)
        tag.tag.save()

        e5.delete(0, len(e5.get()))
        e5.insert(0, 'save complete')

    except Exception as e:
        e5.delete(0, len(e5.get()))
        e5.insert(0, 'error '+str(e))

 

파일 이름 재지정은 "타이틀 - 아티스트" 형식으로 했다.

리셋의 경우, 모든 엔트리를 지운 후, 결과 엔트리에 clear라고 표시해주었다. 간단하기 때문에 따로 설명하지는 않겠다.


 

05. 마무리

최종적으로 완성된 프로그램의 소스코드는 다음과 같다.

import os
import eyed3
from tkinter import *
    
def reset():
    e1.delete(0, len(e1.get()))
    e2.delete(0, len(e2.get()))
    e3.delete(0, len(e3.get()))
    e4.delete(0, len(e4.get()))
    e5.delete(0, len(e5.get()))

    e5.insert(0, 'clear')
    
def save():
    try:
        name = e1.get()
        title = e2.get()
        album = e3.get()
        artist = e4.get()
        
        tag = eyed3.load((os.getcwd())+"/"+name+".mp3")
        tag.tag.artist = artist
        tag.tag.album = album
        tag.tag.title = title

        tag.rename(title+' - '+artist)
        tag.tag.save()

        e5.delete(0, len(e5.get()))
        e5.insert(0, 'save complete')

    except Exception as e:
        e5.delete(0, len(e5.get()))
        e5.insert(0, 'error '+str(e))


window = Tk()
window.geometry('260x300')
window.resizable(width=False, height=False)


l1 = Label(window, text = 'mp3 속성 편집', fg = 'orange', font = 'helvetica 16 bold')
l2 = Label(window, text = '파일 이름: ')
l3 = Label(window, text = '제목: ')
l4 = Label(window, text = '앨범: ')
l5 = Label(window, text = '아티스트: ')

l1.place(x=15, y=10)
l2.place(x=10, y=50)
l3.place(x=10, y=100)
l4.place(x=10, y=130)
l5.place(x=10, y=160)



e1 = Entry(window)
e2 = Entry(window)
e3 = Entry(window)
e4 = Entry(window)
e5 = Entry(window)

e1.place(x=75, y=50)
e2.place(x=75, y=100)
e3.place(x=75, y=130)
e4.place(x=75, y=160)
e5.place(x=75, y=250)


b1 = Button(window, text = "정보 저장", command=save)
b2 = Button(window, text = "리셋", command=reset)

b1.place(x=80, y=200)
b2.place(x=180, y=200)

window.mainloop()

 

실제로 사용해보면 다음과 같다. 임창정의 소주 한잔 파일을 편집해보았다.

 

원하는 대로 잘 작동한 것을 확인할 수 있다.

하지만 아직 더 발전시킬 여지가 남아있다.

  1. 여전히 제목과 앨범, 아티스트를 직접 입력해주어야한다. 이마저도 자동화시킨다면?
  2. 음악을 보다 풍성하게 즐기기 위해 앨범커버와 가사도 넣어보자.

 

기회가 된다면 이에 대한 해답을 찾아 포스팅해보도록 하겠다.

728x90
반응형

댓글