Ubuntu 사용자로서 Rhythmbox를 기본 뮤직 플레이어로 사용하는데,
Lyrics Plugin에서 K-Pop가사를 지원하는 소스가 없어, 알송 가사 서비스를 가져오도록 추가함.
1. Python requests를 이용 ALSong Lyrics 추출 (Artist, Title)
: https://item4.github.io/2018-10-20/Fetch-Alsong-Lyrics-with-Python/
2. lLyrics에서 Artist, Title의 한글 문자열이 Hangul Jamo (U+1100 ~ U+11FF)방식으로 표현되어
이를 Hangul Syllables (U+AC00 ~ U+D7AF)로 전환 후 UTF-8 인코딩하도록 추가 작업
: https://pypi.org/project/jamotools/
추가수정 : 유니코드 한글이 왜 자모로 변환되었는지 찾았습니다. lLyrics에서 NFKD로 정규화를 해서 Hangul Jamo로 전환되었던거네요.
lLyrics.py:492: artist = unicodedata.normalize('NFKD', artist)
lLyrics.py:494: title = unicodedata.normalize('NFKD', title)
jamotools 대신 unicodedata를 쓰는 것으로 바꿨습니다.
ALSongLyricsParser.py:52: title = unicodedata.normalize("NFC", self.title),
ALSongLyricsParser.py:53: artist = unicodedata.normalize("NFC", self.artist),
작업한 소스 저장소 :
https://github.com/jang574/lLyrics
unicodedata에서 유니코드 정규화를 지원함.
#!/usr/bin/python3
import unicodedata
text1 = b'\xe1\x84\x80\xe1\x85\xb5\xe1\x86\xaf\xe1\x84\x80\xe1\x85\xa1\xe1\x84\x8b\xe1\x85\xa6'
text2 = b'\xea\xb8\xb8\xea\xb0\x80\xec\x97\x90'
print("text1 : {}".format(text1.decode('utf-8')))
print("text2 : {}".format(text2.decode('utf-8')))
print("------ text1 -------")
for c in text1.decode('utf-8'):
print( unicodedata.name(c))
print("------ text2 -------")
for c in text2.decode('utf-8'):
print( unicodedata.name(c))
print("------ Normalize text1 using NFC -------")
for c in unicodedata.normalize("NFC", text1.decode('utf-8')):
print( unicodedata.name(c))
print("------ Normalize text2 using NFD -------")
for c in unicodedata.normalize("NFD", text2.decode('utf-8')):
print( unicodedata.name(c))
출력
text1 : 길가에
text2 : 길가에
------ text1 -------
HANGUL CHOSEONG KIYEOK
HANGUL JUNGSEONG I
HANGUL JONGSEONG RIEUL
HANGUL CHOSEONG KIYEOK
HANGUL JUNGSEONG A
HANGUL CHOSEONG IEUNG
HANGUL JUNGSEONG E
------ text2 -------
HANGUL SYLLABLE GIL
HANGUL SYLLABLE GA
HANGUL SYLLABLE E
------ Normalize text1 using NFC -------
HANGUL SYLLABLE GIL
HANGUL SYLLABLE GA
HANGUL SYLLABLE E
------ Normalize text2 using NFD -------
HANGUL CHOSEONG KIYEOK
HANGUL JUNGSEONG I
HANGUL JONGSEONG RIEUL
HANGUL CHOSEONG KIYEOK
HANGUL JUNGSEONG A
HANGUL CHOSEONG IEUNG
HANGUL JUNGSEONG E