diff --git a/PyLyrics/__init__.pyc b/PyLyrics/__init__.pyc
index 38b4666..e8469b5 100644
Binary files a/PyLyrics/__init__.pyc and b/PyLyrics/__init__.pyc differ
diff --git a/PyLyrics/classes.pyc b/PyLyrics/classes.pyc
index d2aaa8f..2f4050d 100644
Binary files a/PyLyrics/classes.pyc and b/PyLyrics/classes.pyc differ
diff --git a/PyLyrics/functions.py b/PyLyrics/functions.py
index e4c7e19..ec10f5f 100644
--- a/PyLyrics/functions.py
+++ b/PyLyrics/functions.py
@@ -1,110 +1,125 @@
+import sys
import requests
from bs4 import BeautifulSoup, Comment, NavigableString
import sys, codecs, json
class Track(object):
- def __init__(self,trackName,album,artist):
- self.name = trackName
- self.album = album
- self.artist = artist
- def __repr__(self):
- return self.name
- def link(self):
- return 'http://lyrics.wikia.com/{0}:{1}'.format(self.artist.replace(' ', '-'),self.name.replace(' ','-'))
- def getLyrics(self):
- return PyLyrics.getLyrics(self.artist,self.name)
+ def __init__(self,trackName,album,artist):
+ self.name = trackName
+ self.album = album
+ self.artist = artist
+ def __repr__(self):
+ return self.name
+ def link(self):
+ return 'http://lyrics.wikia.com/{0}:{1}'.format(self.artist.replace(' ', '-'),self.name.replace(' ','-'))
+ def getLyrics(self):
+ return PyLyrics.getLyrics(self.artist,self.name)
class Artist(object):
- def __init__(self, name):
- self.name = name
- def getAlbums(self):
- return PyLyrics.getAlbums(self.name)
- def __repr__(self):
- return self.name.encode('utf-8')
+ def __init__(self, name):
+ self.name = name
+ def getAlbums(self):
+ return PyLyrics.getAlbums(self.name)
+ def __repr__(self):
+ return self.name.encode('utf-8')
class Album(object):
- def __init__(self, name, link,singer):
- self.year = name.split(' ')[-1]
- self.name = name.replace(self.year,' ').rstrip()
- self.url = link
- self.singer = singer
- def link(self):
- return self.url
- def __repr__(self):
- if sys.version_info[0] == 2:
- return self.name.encode('utf-8','replace')
- return self.name
- def artist(self):
- return self.singer
- def tracks(self):
- return PyLyrics.getTracks(self)
+ def __init__(self, name, link,singer):
+ self.year = name.split(' ')[-1]
+ self.name = name.replace(self.year,' ').rstrip()
+ self.url = link
+ self.singer = singer
+ def link(self):
+ return self.url
+ def __repr__(self):
+ if sys.version_info[0] == 2:
+ return self.name.encode('utf-8','replace')
+ return self.name
+ def artist(self):
+ return self.singer
+ def tracks(self):
+ return PyLyrics.getTracks(self)
class PyLyrics:
- @staticmethod
- def getAlbums(singer):
- singer = singer.replace(' ', '_')
- s = BeautifulSoup(requests.get('http://lyrics.wikia.com/{0}'.format(singer)).text)
- spans = s.findAll('span',{'class':'mw-headline'})
-
- als = []
-
- for tag in spans:
- try:
- a = tag.findAll('a')[0]
- als.append(Album(a.text,'http://lyrics.wikia.com' + a['href'],singer))
- except:
- pass
-
- if als == []:
- raise ValueError("Unknown Artist Name given")
- return None
- return als
- @staticmethod
- def getTracks(album):
- url = "http://lyrics.wikia.com/api.php?action=lyrics&artist={0}&fmt=xml".format(album.artist())
- soup = BeautifulSoup(requests.get(url).text)
-
- for al in soup.find_all('album'):
- if al.text.lower().strip() == album.name.strip().lower():
- currentAlbum = al
- break
- songs =[Track(song.text,album,album.artist()) for song in currentAlbum.findNext('songs').findAll('item')]
- return songs
+ @staticmethod
+ def getAlbums(singer):
+ singer = singer.replace(' ', '_')
+ s = BeautifulSoup(requests.get('http://lyrics.wikia.com/{0}'.format(singer)).text)
+ spans = s.findAll('span',{'class':'mw-headline'})
+
+ als = []
+
+ for tag in spans:
+ try:
+ a = tag.findAll('a')[0]
+ als.append(Album(a.text,'http://lyrics.wikia.com' + a['href'],singer))
+ except:
+ pass
+
+ if als == []:
+ raise ValueError("Unknown Artist Name given")
+ return None
+ return als
+ @staticmethod
+ def getTracks(album):
+ url = "http://lyrics.wikia.com/api.php?action=lyrics&artist={0}&fmt=xml".format(album.artist())
+ soup = BeautifulSoup(requests.get(url).text)
- @staticmethod
- def getLyrics(singer, song):
- #Replace spaces with _
- singer = singer.replace(' ', '_')
- song = song.replace(' ', '_')
- r = requests.get('http://lyrics.wikia.com/{0}:{1}'.format(singer,song))
- s = BeautifulSoup(r.text)
- #Get main lyrics holder
- lyrics = s.find("div",{'class':'lyricbox'})
- if lyrics is None:
- raise ValueError("Song or Singer does not exist or the API does not have Lyrics")
- return None
- #Remove Scripts
- [s.extract() for s in lyrics('script')]
+ for al in soup.find_all('album'):
+ if al.text.lower().strip() == album.name.strip().lower():
+ currentAlbum = al
+ break
+ songs =[Track(song.text,album,album.artist()) for song in currentAlbum.findNext('songs').findAll('item')]
+ return songs
- #Remove Comments
- comments = lyrics.findAll(text=lambda text:isinstance(text, Comment))
- [comment.extract() for comment in comments]
+ @staticmethod
+ def getLyrics(singer, song):
+ # Replace spaces with _
+ singer = singer.replace(' ', '_')
+ song = song.replace(' ', '_')
+ r = requests.get('http://lyrics.wikia.com/{0}:{1}'.format(singer,song))
+ s = BeautifulSoup(r.text, features="html.parser")
+ if s.find('i') is None:
+ # raise ValueError("API could not find the song.")
+ return None
- #Remove unecessary tags
- for tag in ['div','i','b','a']:
- for match in lyrics.findAll(tag):
- match.replaceWithChildren()
- #Get output as a string and remove non unicode characters and replace
with newlines
- output = str(lyrics).encode('utf-8', errors='replace')[22:-6:].decode("utf-8").replace('\n','').replace('
','\n')
- try:
- return output
- except:
- return output.encode('utf-8')
+ album = str(s.find('i').find('a').text)
+ lyrics = s.find("div",{'class':'lyricbox'})
+
+ if lyrics is None:
+ raise ValueError("API could not find the lyrics to the song.")
+ return None
+
+ # Remove Scripts
+ [s.extract() for s in lyrics('script')]
+
+ # Remove Comments
+ comments = lyrics.findAll(text=lambda text:isinstance(text, Comment))
+ [comment.extract() for comment in comments]
+
+ # Remove unecessary tags
+ for tag in ['div','i','b','a']:
+ for match in lyrics.findAll(tag):
+ match.replaceWithChildren()
+ #Get output as a string and remove non unicode characters and replace\
+ #
with newlines
+
+ # Python 3
+ if sys.version_info.major > 2:
+ output = str(lyrics).encode('utf-8', errors='replace')[22:-6:].\
+ decode("utf-8").replace('\n','').replace('
','\n')
+ else: # Python 2
+ output = str(lyrics)[22:-6:].decode("utf-8").replace('\n','').\
+ replace('
','\n')
+ try:
+ return [album, output]
+ except:
+ return [album, output.encode('utf-8')]
def main():
- albums = PyLyrics.getAlbums('OneRepublic')
- print (albums)
- tracks = PyLyrics.getTracks(albums[-1])
- print (tracks[7].getLyrics())
-
+ albums = PyLyrics.getAlbums('OneRepublic')
+ print (albums)
+ tracks = PyLyrics.getTracks(albums[-1])
+ print (tracks[7].getLyrics())
+
if __name__=='__main__':
- main()
\ No newline at end of file
+ main()
diff --git a/PyLyrics/functions.pyc b/PyLyrics/functions.pyc
index 8bd9a13..5ea3ce6 100644
Binary files a/PyLyrics/functions.pyc and b/PyLyrics/functions.pyc differ
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..bb3f4e7
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,10 @@
+backports.functools-lru-cache==1.5
+BeautifulSoup==3.2.1
+beautifulsoup4==4.7.1
+bs4==0.0.1
+certifi==2019.6.16
+chardet==3.0.4
+idna==2.8
+requests==2.22.0
+soupsieve==1.9.1
+urllib3==1.25.3