Рубрики
Без рубрики

Создание графического приложения Spotify-Lyrics для Linux

Базовое графическое приложение для отображения текста песни, воспроизводимой в приложении Spotify для систем Linux

Автор оригинала: Dushyant Rathore.

Что такое приложение с графическим интерфейсом ?

Это простое приложение с графическим интерфейсом, которое генерирует текст песни, воспроизводимой в настоящее время в приложении Spotify для систем Linux. В большинстве случаев нам пришлось бы путешествовать по сети, чтобы получить текст песни, которая нам нравится, и иногда это довольно раздражающая процедура. Это приложение представляет собой одноэтапное решение проблемы, в которой тексты песен генерируются бок о бок.

Шаги, которые необходимо выполнить

Базовая настройка разделена на следующие три этапа:

  • Получение названия песни, которая в настоящее время воспроизводится в приложении spotify
  • Получение текста песни
  • Отображение всей информации в графическом приложении

Давайте начнем с процесса разработки.

Получение названия песни

Следующий фрагмент кода объясняет процесс создания имени воспроизводимой песни:

import dbus
import re


def get_song_details():

    try:
        # Setup a new bus session
        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")

        # The property Metadata behaves like a python dict
        # for key, value in metadata.items():
        #     print key, value

        # To just print the title

        song_artist = metadata['xesam:artist']
        song_artist = str(song_artist[0]).lower()
        song_artist = song_artist.replace(" ", "")

        song_title = str(metadata['xesam:title']).lower()
        song_title = song_title.replace(" ", "")

        song_art = metadata['mpris:artUrl']
        song_art = str(song_art)

        song_title = re.sub("[\(\[].*?[\)\]]", "", song_title)
        song_title = re.sub('[^A-Za-z0-9]+', '', song_title)

        song_artist = re.sub("[\(\[].*?[\)\]]", "", song_artist)
        song_artist = re.sub('[^A-Za-z0-9]+', '', song_artist)

        print song_title
        print song_artist
        print song_art

        song ={}
        song["song_artist"] = song_artist
        song["song_title"] = song_title
        song["song_art"] = song_art

        return song

    except Exception as e:
        return 0

Давайте попробуем проанализировать код шаг за шагом:

  • Сначала мы включаем необходимые пакеты python, которые будут использоваться в этом процессе.
  • Следующий шаг использует сеанс dbus для извлечения метаданных из интерфейса приложения spotify. Чтобы установить dbus , используйте следующий код:
sudo apt-get install python-dbus
  • Наконец, мы используем регулярные выражения для удаления ненужных символов из имени исполнителя и песни. Словарь python со всеми важными деталями песни формируется и возвращается из функции.

Получение текста песни

Следующий фрагмент кода использует имя песни и исполнителя в качестве параметров для извлечения текста из azlyrics.com. Здесь мы использовали BeautifulSoup, чтобы очистить текст песни.

import requests
import urllib2
from bs4 import BeautifulSoup


def get_lyrics(artist, song):

    url = "http://www.azlyrics.com/lyrics/" + artist + "/" + song + ".html"

    # add header
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'}

    request = urllib2.Request(url, headers=headers)
    lyrics_file = urllib2.urlopen(request)
    lyrics_html = lyrics_file.read()
    lyrics_file.close()

    soup = BeautifulSoup(lyrics_html, 'html.parser')

    l = []

    for div in soup.find_all('div', attrs={'class': 'col-xs-12 col-lg-8 text-center'}):
        for sub_div in div.find_all('div'):
            l.append(sub_div.text)

    l = map(lambda s: s.strip(), l)

    return l

Построение графического интерфейса для отображения информации

Следующий фрагмент кода посвящен разработке графического интерфейса:

from Get_song_details import get_song_details
from Get_lyrics import get_lyrics
from Tkinter import *
from PIL import ImageTk, Image
import urllib
import Image
import ImageTk


class GUI():

    def __init__(self):
        song = get_song_details()

        if song == 0 :
            print "Spotify is currently inactive"

        else:

            art_url = song["song_art"]
            lyrics = get_lyrics(song["song_artist"], song["song_title"])

            f = urllib.urlretrieve(art_url, "cover.jpg")

            self.root = Tk()
            self.root.geometry('700x700')
            self.root.title("Spotify Lyrics")
            self.mainframe = Frame(self.root, padx=10, pady=10)


            self.label1 = Label(self.mainframe, text="Song : ")
            self.label1.config(font=("Arial", 18))

            self.label2 =  Label(self.mainframe, text = song["song_title"])
            self.label2.config(font=("Arial", 18))

            self.label3 = Label(self.mainframe, text="Artist : ")
            self.label3.config(font=("Arial", 18))

            self.label4 = Label(self.mainframe, text=song["song_artist"])
            self.label4.config(font=("Arial", 18))

            # Setting the image up
            img = ImageTk.PhotoImage(Image.open("cover.jpg"))

            # Displaying the image

            self.imglabel = Label(self.mainframe, image=img)

            # Textbox for lyrics
            self.T = Text(self.mainframe)
            self.T.insert(END, lyrics[6])

            # Grid Packing

            self.label1.grid(row=0, sticky=E)
            self.label2.grid(row=0, column=1)
            self.label3.grid(row=1, sticky=E)
            self.label4.grid(row=1, column=1)
            self.imglabel.grid(row=2, column = 0, columnspan =2)
            self.T.grid(row=4, column=0, columnspan = 3)

            self.mainframe.pack()

            self.root.mainloop()


if __name__ == "__main__":
    GUI()

Давайте попробуем проанализировать код шаг за шагом:

  • На первом этапе мы включили необходимые пакеты для создания графического приложения. Здесь мы используем Tkinter для создания графического интерфейса. Он может быть установлен с помощью следующего кода:
sudo apt-get install python-tk
  • На следующем шаге мы извлекаем детали песни, используя код, описанный в предыдущем фрагменте. Используя имя исполнителя и песню, мы получаем текст песни.
  • На следующем шаге мы формируем базовую структуру графического интерфейса, используя различные функции, доступные в пакете Tkinter.
  • Наконец, все элементы графического интерфейса выровнены по своим соответствующим позициям, чтобы придать графическому интерфейсу последние штрихи.

При запуске скрипта мы получаем следующий вывод:

Скриншот с 2017-10-14 10-57-22.png

Репозиторий Github для этого приложения desktop notifier: Spotify_lyrics .

Не стесняйтесь раскошеливаться, предлагать изменения или указывать на ошибки!

Надеюсь, вы нашли это полезным 😄