docs: def safe_download(self):
          """Download a song respecting Grooveshark's API.
  
          :return: The raw song data.
          """
          def _markStreamKeyOver30Seconds(stream):
              self._connection.request(
                  'markStreamKeyOver30Seconds',
                  {'streamServerID': stream.ip,
                   'artistID': self.artist.id,
                   'songQueueID': self._connection.session.queue,
                   'songID': self.id,
                   'songQueueSongID': 1,
                   'streamKey': stream.key},
                  self._connection.header('markStreamKeyOver30Seconds', 'jsqueue'))
  
          stream = self.stream
          timer = threading.Timer(30, _markStreamKeyOver30Seconds, [stream])
          timer.start()
          raw = stream.data.read()
          if len(raw) == stream.size:
              timer.cancel()
              self._connection.request(
                  'markSongDownloadedEx',
                  {'streamServerID': stream.ip,
                   'songID': self.id,
                   'streamKey': stream.key},
                  self._connection.header('markSongDownloadedEx', 'jsqueue'))
              self._connection.request(
                  'removeSongsFromQueue',
                  {'userRemoved': True,
                   'songQueueID': self._connection.session.queue,
                   'songQueueSongIDs': [1]},
                  self._connection.header('removeSongsFromQueue', 'jsqueue'))
              return raw
          else:
              raise ValueError("Content-Length {}, but read {}"
                               .format(stream.size, len(raw)))