<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_song_by_url(self, song_url, song_name, folder, lyric_info):
 """Download a song and save it to disk. :params song_url: download address. :params song_name: song name. :params folder: storage path. :params lyric: lyric info. """


        if not os.path.exists(folder):
            os.makedirs(folder)
        fpath = os.path.join(folder, song_name+'.mp3')

        if sys.platform == 'win32' or sys.platform == 'cygwin':
            valid_name = re.sub(r'[<>:"/\\|?*]', '', song_name)
            if valid_name != song_name:
                click.echo('{} will be saved as: {}.mp3'.format(song_name, valid_name))
                fpath = os.path.join(folder, valid_name + '.mp3')

        if not os.path.exists(fpath):
            resp = self.download_session.get(
                song_url, timeout=self.timeout, stream=True)
            length = int(resp.headers.get('content-length'))
            label = 'Downloading {} {}kb'.format(song_name, int(length/1024))

            with click.progressbar(length=length, label=label) as progressbar:
                with open(fpath, 'wb') as song_file:
                    for chunk in resp.iter_content(chunk_size=1024):
                        if chunk:  # filter out keep-alive new chunks
                            song_file.write(chunk)
                            progressbar.update(1024)

        if lyric_info:
            folder = os.path.join(folder, 'lyric')
            if not os.path.exists(folder):
                os.makedirs(folder)
            fpath = os.path.join(folder, song_name+'.lrc')
            with open(fpath, 'w') as lyric_file:
                lyric_file.write(lyric_info)