Автор оригинала: 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.
- Наконец, все элементы графического интерфейса выровнены по своим соответствующим позициям, чтобы придать графическому интерфейсу последние штрихи.
При запуске скрипта мы получаем следующий вывод:
Репозиторий Github для этого приложения desktop notifier: Spotify_lyrics .
Не стесняйтесь раскошеливаться, предлагать изменения или указывать на ошибки!
Надеюсь, вы нашли это полезным 😄