johnwmillr / LyricsGenius

Download song lyrics and metadata from Genius.com 🎶🎤
http://www.johnwmillr.com/scraping-genius-lyrics/
MIT License
899 stars 159 forks source link

Artist.save_lyrics failing #71

Closed TwistedAsylumMC closed 5 years ago

TwistedAsylumMC commented 5 years ago

Describe the bug Using the code artist.save_lyrics() I am given an error when running the script

Expected behavior I expected the lyrics of a chosen song to be saved to a file

To Reproduce Describe the steps required to reproduce the behavior. Use the following code:

import lyricsgenius as genius

api = genius.Genius("MY TOKEN") # Replaced my api token with "MY TOKEN"
artist = api.search_artist("Ariana Grande", max_songs=1)
song = api.search_song("thank u, next", artist.name)
artist.add_song(song)
artist.save_lyrics()

Include the error message associated with the bug.

Traceback (most recent call last):
  File "C:\Users\sebfa\PycharmProjects\TTS\main.py", line 8, in <module>
    artist.save_lyrics()
  File "C:\Users\sebfa\PycharmProjects\TTS\venv\lib\site-packages\lyricsgenius\artist.py", line 109, in save
_lyrics
    filename = "Lyrics_{}.{}".format(self.artist.replace(" ", ""), format_)
AttributeError: 'Artist' object has no attribute 'artist'

Version info

Additional context Add any other context about the problem here.

johnwmillr commented 5 years ago

Ah, thanks for catching this bug! I think the fix is as changing self.artist to self.name. I'll try to make the fix and update the code tonight.

johnwmillr commented 5 years ago

Hopefully that small change fixes the bug! I had written a test for Artist.save_lyrics, but the test supplies a filename to the function; this bug only shows up when the user doesn't pass a filename in.

robot3498712 commented 5 years ago

Hi, something appears being off still. Minimal script is failing:

import lyricsgenius as genius access_token = 'XXXX' api = genius.Genius(access_token) artist = api.search_artist("The Beatles", max_songs=3) artist.savelyrics(format='json', filename='out.json')


.\python\lyrics>py -3 ./genius.py Searching for songs by The Beatles...

Song 1: "12-Bar Original" Song 2: "1822!" "1 [Booklet]" is not valid. Skipping. "20 Greatest Hits - Art and Tracklist" is not valid. Skipping. Song 3: ""Abbey Road" side two"

Reached user-specified song limit (3). Done. Found 3 songs. Traceback (most recent call last): File "./genius.py", line 19, in artist.savelyrics(format='json', filename='out.json') File "C:\Python3\lib\site-packages\lyricsgenius\artist.py", line 129, in save_lyrics lyrics_to_write['songs'][-1]['album'] = song.album File "C:\Python3\lib\site-packages\lyricsgenius\song.py", line 45, in album if 'album' in self._body and 'name' in self._body['album']: TypeError: argument of type 'NoneType' is not iterable

.\python\lyrics>py -3 --version Python 3.6.2

johnwmillr commented 5 years ago

Shoot, okay. I'll try to take another look in the next couple of days. Thanks for following up.

johnwmillr commented 5 years ago

@robot3498712 hopefully #75 fixes this bug for you. I was using a sloppy method of accessing elements within the Song object's self._body dictionary, causing an error when the requested field wasn't present in the dict. Let me know if you do run into any more bugs!

robot3498712 commented 5 years ago

@johnwmillr Thank you, I can confirm issue is fixed. Cheers!