How to create Song lyrics finder application using python
Lyrics finder application using python

I am a Engineer
Introduction
In general song lyrics finder to used to find song lyrics that are tough to remember and recognize so it will be very helpful for karaoke and sing-along. In this blog, we are going to see how to create a song lyrics finder using python
Requirements
pip install python-docx
pip install beautifulsoup4
pip install requests
Python-Docx is used to create a word document. Beautifulsoup4 is used to read and extract from webpages. Requests are used to make user request in the browser.
How to get lyrics from a website?
import requests
from bs4 import BeautifulSoup
songname="2002"
html_file=requests.get("https://search.azlyrics.com/search.php?q="+songname).text
soup=BeautifulSoup(html_file,"lxml")
match=[x.extract() for x in soup.findAll('td',class_='text-left visitedlyr')]
link=str(list(match[0])[1]).split('"')
html_files=requests.get(link[1]).text
soup=BeautifulSoup(html_files,"lxml")
match=[x.extract() for x in soup.findAll('div',class_='col-xs-12 col-lg-8 text-center')]
lyrics=str(match).split("\n")
start=lyrics.index('<!-- Usage of azlyrics.com content by any third-party lyrics provider is prohibited by our licensing agreement. Sorry about that. -->\r')
end=lyrics.index('<!-- MxM banner -->')
print(lyrics[start+1:end-2])
for i in lyrics[start+1:end-2]:
f=i.replace("<br/>","")
print(f)
Requesting a song lyrics link
songname="2002"
html_file=requests.get("https://search.azlyrics.com/search.php?q="+songname).text
soup=BeautifulSoup(html_file,"lxml")
Then in soup it will have the entire website code we have to extract
match=[x.extract() for x in soup.findAll('td',class_='text-left visitedlyr')]
link=str(list(match[0])[1]).split('"')
then further extraction will give the song lyrics link:- https://www.azlyrics.com/lyrics/annemarie/2002.html
Extracting song lyrics
By using the song lyrics link we have to again make a request
html_files=requests.get(link[1]).text
soup=BeautifulSoup(html_files,"lxml")
Then we have to extract
match=[x.extract() for x in soup.findAll('div',class_='col-xs-12 col-lg-8 text-center')]
lyrics=str(match).split("\n")
start=lyrics.index('<!-- Usage of azlyrics.com content by any third-party lyrics provider is prohibited by our licensing agreement. Sorry about that. -->\r')
end=lyrics.index('<!-- MxM banner -->')
lyrics=lyrics[start+1:end-2]
Then Further extraction will give the desired song lyrics: -
I will always remember The day you kissed my lips Light as a feather And it went just like this No, it's never been better Than the summer of two thousand and two
We were only eleven But acting like grown-ups Like we are in the present Drinking from plastic cups Singing "love is forever and ever" Well, I guess that was true
Combining with GUI
from tkinter import *
from tkinter import messagebox
from docx import Document
import requests
from bs4 import BeautifulSoup
import random
root=Tk()
root.title("Lyrics Finder")
myscroll=Scrollbar(root,orient=VERTICAL)
lables2=[]
numline=0
def new_lyrics():
global numline
global lables
global frame1
global removebtn
global count2
global lables2
global songbox
global e1
rem()
songname=e1.get().replace(" ","+")
fgh=[]
html_file=requests.get("https://search.azlyrics.com/search.php?q="+songname).text
soup=BeautifulSoup(html_file,"lxml")
match=[x.extract() for x in soup.findAll('td',class_='text-left visitedlyr')]
if match==[]:
messagebox.showinfo("Lyric Finder","song not found ")
return
link=str(list(match[0])[1]).split('"')
html_files=requests.get(link[1]).text
soup=BeautifulSoup(html_files,"lxml")
match=[x.extract() for x in soup.findAll('div',class_='col-xs-12 col-lg-8 text-center')]
lyrics=str(match).split("\n")
start=lyrics.index('<!-- Usage of azlyrics.com content by any third-party lyrics provider is prohibited by our licensing agreement. Sorry about that. -->\r')
end=lyrics.index('<!-- MxM banner -->')
for i in lyrics[start+1:end-2]:
f=i.replace("<br/>","")
songbox.insert(END," "+f)
lables2=lyrics[start+1:end-2]
numline=len(lables2)
removebtn.grid(row=0,column=3,padx=2)
save.grid(row=0,column=4,padx=2)
def sa():
global lables2
global numline
global lynum
global e1
lynum=random.randint(0, 100)
na=e1.get()
name=na+"("+str(lynum)+").docx"
doc =Document()
doc.add_heading(na)
with open(name,"a") as f:
for i in range(numline):
try:
encoded=lables2[i].encode('utf-8')
doc.add_paragraph(lables2[i].replace("<br/>",""))
except:
pass
doc.save(name)
messagebox.showinfo("lyric finder","song lyrics saved as "+name)
def rem():
global numline
global lables
global removebtn
global lables2
global songbox
global e1
lables2=[]
songbox.delete(0,numline-1)
removebtn.grid_forget()
save.grid_forget()
frame1=Frame(root)
labe=Label(frame1,text="Enter the song name:")
labe.grid(row=0,column=0)
e1=Entry(frame1,width=30)
e1.grid(row=0,column=1,padx=5)
sea=Button(frame1,text="Search",command=new_lyrics)
sea.grid(row=0,column=2,padx=2)
frame2=Frame(root)
myscroll2=Scrollbar(frame2,orient=HORIZONTAL)
myscroll=Scrollbar(frame2,orient=VERTICAL)
songbox=Listbox(frame2,width=70,height=30,borderwidth=0,bg="#fce303",fg="black",yscrollcommand=myscroll.set,font=("arial",13),xscrollcommand=myscroll2.set)
myscroll.config(command=songbox.yview)
myscroll2.config(command=songbox.xview)
myscroll.pack(side=RIGHT,fill=Y)
myscroll2.pack(side=BOTTOM,fill=X)
songbox.pack()
frame2.grid(row=1,column=0,pady=10)
removebtn=Button(frame1,text="Clear",command=rem)
save=Button(frame1,text="Save",command=sa)
frame1.grid(row=0,column=0)
root.mainloop()
Functions
rem()
This will clear the listbox and make it empty
sa()
This function will save the lyrics in ".docx" format and the show lyrics successfully saved as xxxx.docx.


new_lyrics()
This function will first empty the listbox using the rem() function then it will extract song lyrics from the web and display them in the list box

Github link:- click here






