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