docs: def from_filename(cls, filename):
          """
          Class constructor using the path to the corresponding mp3 file. The
          metadata will be read from this file to create the song object, so it
          must at least contain valid ID3 tags for artist and title.
          """
          if not filename:
              logger.error('No filename specified')
              return None
  
          if not os.path.exists(filename):
              logger.error("Err: File '%s' does not exist", filename)
              return None
  
          if os.path.isdir(filename):
              logger.error("Err: File '%s' is a directory", filename)
              return None
  
          try:
              audiofile = eyed3.load(filename)
          except Exception as error:
              print(type(error), error)
              return None
  
          # Sometimes eyed3 may return a null object and not raise any exceptions
          if audiofile is None:
              return None
  
          tags = audiofile.tag
          album = tags.album
          title = tags.title
          lyrics = ''.join([l.text for l in tags.lyrics])
          artist = tags.album_artist
          if not artist:
              artist = tags.artist
  
          song = cls(artist, title, album, lyrics)
          song.filename = filename
          return song