Spotify와 Genius API를 통합하여 Python으로 쉽게 가사를 캡처하는 방법

13812 단어 pythonapi


이 글은 최초로 나의 개인blog에 발표되었다.
안녕하세요!
이 글에서, 나는 작년에 쓴Python 스크립트를 이야기하기로 결정했는데, 지금도 나는 그것을 자주 사용하고 있다.
이것은 당신이 생각이 있을 때입니다. 당신은 이것에 대해 매우 흥분하지만, 이것이 당신이 바라는 대로 작용할지 모르겠습니다.저는 기본적으로 Python의 지식에서 시작했고 어떤 API를 사용해서 이 생각을 실현할지 알고 있습니다.
목표는 스크립트를 실현하는 것이다. 나는 그것으로 현재 Spotify에서 재생되고 있는 노래의 가사를 얻을 수 있다.그래서 처음에는 인터페이스를 제공하기 위해 스크립트를 컴퓨터에서 실행되는 Spotify 서비스와 연결할 수 있는 것이 필요하다는 것을 알았다.그 밖에 저는 Genius.com의 충실한 사용자이기 때문에 저는 그들이 대형 공공 API를 가지고 있다는 것을 알고 있습니다. 저는 그 중에서 도움을 받을 수 있습니다.
Spotify를 장기간 사용하는 사용자에게 Spotify가 언제 데스크톱 응용 프로그램에서 가사를 표시하는 기능을 갖추고 있는지 기억할 수 있겠지?지난날의 좋은 시절.나는 여전히 왜 그것이 삭제되었는지 모르겠지만, 우리가 지금 얻은 것은 단지 Behind the Lyrics 기능일 뿐이다. 그것은 쓸모없는 정보와 우리가 듣고 있는 노래의 가사 부분을 보여 준다. (모바일 기기에서만 사용할 수 있는 것 같다.)

여기서부터 나는 스크립트의 실현 순서에 따라 그것을 분해할 것이다.계속하기 전에 전체 스크립트를 확인하려면 Github의 this repository 로 이동합니다.여기에서 당신은 그것을 어떻게 운행하는지 알게 될 것입니다. 그러나 기억해 주십시오. 저도 본문에서 당신을 지도할 것입니다.

Spotify에 연결


이것은 내가 어떻게 해야 할지 모르는 일 중의 하나이기 때문에 나는 어쩔 수 없이 구글 검색을 통해 완성해야 한다.다행히도 이것answerjooon에서 Stackoverflow에서 저를 위해 많은 시간을 절약해 주셔서 영광입니다.
기본적으로 저는 Linux 사용자이기 때문에 제가 사용하는 Spotify 클라이언트는 MPRIS라는 D 버스 인터페이스 - 미디어 플레이어 원격 인터페이스 규범을 자동으로 만듭니다.
D-Bus 사양 페이지에서 D-Bus API는 일반적으로 여러 클라이언트 프로그램에서 사용할 서비스를 구현하는 데 사용됩니다.이 메시지 시스템은 같은 데스크톱 세션의 데스크톱 응용 프로그램 간의 통신, 그리고 데스크톱 세션과 운영체제 간의 통신, 그리고 모든 시스템 프로세스를 포함하는 두 가지 특정한 상황에 사용된다.
D-Bus 시스템은 몇 개의 층이 있는데 그 중 하나는 포장 라이브러리로 구성되어 있는데 이것이 바로 우리가 여기서 사용하는 도구이다.Python 스크립트가 Spotify 데스크톱 응용 프로그램과 통신할 수 있도록 dbus-python 패키지 라이브러리나 기술적으로 binding 라이브러리를 사용합니다.시스템에 이 라이브러리를 설치한 후 libdbus 모듈을 사용하여 dbus 을 만들 수 있습니다. 이 라이브러리를 사용하여 Spotify와 통신할 것입니다.
만약 당신이 Ubuntu에 있고 어떤 이유로든 설치하지 않았다면 SessionBus 실행을 통해 설치할 수 있습니다. dbus-python
import dbus

def get_current_song_info():
    # kudos to jooon from this stackoverflow question http://stackoverflow.com/a/33923095
    session_bus = dbus.SessionBus()
    spotify_bus = session_bus.get_object('org.mpris.MediaPlayer2.spotify',
                                         '/org/mpris/MediaPlayer2')
    spotify_properties = dbus.Interface(spotify_bus,
                                        'org.freedesktop.DBus.Properties')
    metadata = spotify_properties.Get('org.mpris.MediaPlayer2.Player', 'Metadata')

    return {'artist': metadata['xesam:artist'][0], 'title': metadata['xesam:title']}
위의 코드에서 우리는 apt-get install python-dbus 실례를 만들고 이 실례를 사용하여 Spotify 응용 프로그램이 있는 SessionBus 실례를 만들 수 있습니다.
이러한 연결을 통해 우리는 이 세션의 메타데이터를 추출할 수 있습니다. 이것은 현재 Spotify 세션에 대한 대량의 정보를 제공할 것입니다. 예술가의 이름과 현재 재생된 노래를 포함합니다. 이것이 바로 우리가 필요로 하는 것입니다.이 방법은 두 개의 키 Interfaceartist 를 포함하는 사전을 되돌려줍니다.

Genius API에 연결


검색하고 싶은 아티스트와 노래 이름이 생겼으니 Genius API에 계속 요청할 수 있습니다.
이를 위해서는 Genius API 클라이언트를 만들어서 얻을 수 있는 액세스 토큰이 필요합니다.우선, 우리는 반드시 sign up 계정을 신청해야 한다. (만약 당신이 이미 Genius에 계정이 있다면 로그인하십시오.)그런 다음 Genius API 문서 페이지로 이동할 수 있습니다manage your clients.새 클라이언트를 만드는 과정은 매우 간단합니다. 나중에 방문 영패를 받을 것입니다.
일단 당신이 방문 영패를 가지고 있다면, 우리는 다음 방법을 실현할 수 있습니다.
import requests

def request_song_info(song_title, artist_name):
    base_url = 'https://api.genius.com'
    headers = {'Authorization': 'Bearer ' + 'INSERT YOUR TOKEN HERE'}
    search_url = base_url + '/search'
    data = {'q': song_title + ' ' + artist_name}
    response = requests.get(search_url, data=data, headers=headers)

    return response

이 방법은 Spotify 세션에서 추출한 노래와 아티스트 이름을 수신하고 Genius API에 요청을 보냅니다.참고로 GET 요청은 requests HTTP 라이브러리로 전송됩니다.

가사 추출


모든 것이 정상이라면 API에서 찾은 모든 일치하는 항목에 대한 정보가 포함된 응답 대상이 있습니다.
요청에서 얻은 대상의 모양 때문에, 이 대상의 title 키를 교체하고, hits 변수를 사용하여 정확한 일치를 찾아야 합니다.
# Search for matches in the request response
    response = request_song_info(song_title, artist_name)
    json = response.json()
    remote_song_info = None

    for hit in json['response']['hits']:
        if artist_name.lower() in hit['result']['primary_artist']['name'].lower():
            remote_song_info = hit
            break
만약 우리가 이 대상에서 일치하는 항목을 성공적으로 찾았다면, 이것은 우리가 찾은 노래가 API에서 사용할 수 있다는 것을 의미하며, 지금은 artist_name 변수에서 사용할 수 있다.
설령 우리가 특정 노래에 관한 모든 정보를 가지고 있다 하더라도, 너는 어떻게 생각하느냐, 우리는 가사가 없다!!정확히 말하면 Genius API(이 스크립트의 실현 날짜에 관하여)는 당신에게 노래의 가사를 직접 제공하지 않습니다.가사를 검색하는 종점도 없다.
사실 이런 상황을 우회하기 위해서 우리는 반드시 노래가 있는 웹 페이지를 잡아야 한다.remote_song_info 에서 해당 노래의 URL을 얻을 수 있습니다.
# Extract lyrics from URL if the song was found
if remote_song_info:
    song_url = remote_song_info['result']['url']
여기서, 우리는 기본적으로 우리의 스크립트가 이 페이지에 접근하고, 가사를 캡처하도록 해야 한다.
from bs4 import BeautifulSoup

def scrap_song_url(url):
    page = requests.get(url)
    html = BeautifulSoup(page.text, 'html.parser')
    lyrics = html.find('div', class_='lyrics').get_text()

    return lyrics
이 방법은 노래 URL을 수신하고 Beautiful Soup 라이브러리를 사용하여 HTML 파일에서 더 간단한 방식으로 데이터를 추출합니다.
이 방법의 실현 과정에서 나는 반드시 되돌아오는 HTML의 구조를 분석하여 내가 무엇을 사용하여 노래 가사를 대표하는 텍스트만 추출할 수 있는지 찾아내야 한다.나는 최종적으로 remote_song_info를 사용했는데 그 중에는 클래스div가 포함되어 있고 그 중에는 모든 가사가 포함되어 있다.나는 그들이 이 표시를 영원히 변경하지 않기를 바란다.
우리는 마침내 가사를 콘솔에 인쇄할 수 있게 되었다.가장 멋있는 것은 기어가는 과정에서 가사의 줄마다 새로운 줄의 의미 서열lyrics이 자동으로 수신된다는 것이다.이렇게 해서 우리는 단말기에서 보기 좋은 구조를 얻었다.

Github 저장소 사용 방법


본고에서 언급한 모든 방법은 본문repository에서 찾을 수 있다.
로컬에서 사용하기 위해서는 메모리 라이브러리를 복제하고 접근 영패를 \n 파일에 추가한 다음repo 폴더에서 다음 명령을 실행하여 노래의 가사를 가져옵니다.Spotify를 열고 재생하는 것을 기억하십시오.)
python get-lyric.py
이 스크립트는 Python 2.7과 Python 3에 모두 적용되어야 합니다.단, 사용 중인 버전과 설치 의존 항목에 사용할 버전을 확인해야 합니다.
저장소에서 다음과 같은 추가 기능을 사용할 수 있습니다.
  • 파일에 자동으로 가사를 제공합니다.
  • 아티스트와 노래 이름을 전달하여 어떤 노래도 검색합니다. (이 모드는 Spotify와 상호작용하지 않기 때문에 열 필요가 없습니다.)검사README.md.
  • 마지막으로 주의하고 싶은 것은 token.txt 파일에서 이 명령에 대한 별명을 만들면 항상 폴더에서 가사를 얻을 필요가 없다는 것이다.
    나에게 있어서, 나는 이 줄을 나의 lyric-view.txt 파일에 추가해야 한다.
    alias lyric="python ~/repos/lyrics-crawler/get-lyric.py"
    
    또한 스크립트 코드의 .bashrc.bashrc 파일에 절대 경로를 사용해야 합니다.
    이렇게 하면 나는 모든 디렉터리에서 명령token.txt을 실행하고 Spotify를 통해 노래가 재생되는 가사를 얻을 수 있다.
    나는 이것이 너에게 좋은 책이길 바란다.저장소에 대한 권장사항이나 기능이 있는 경우 요청을 알려주거나 열어주시면 감사하겠습니다.)
    감사합니다.

    좋은 웹페이지 즐겨찾기