code: def playlist_song_add(
  		self,
  		song,
  		playlist,
  		*,
  		after=None,
  		before=None,
  		index=None,
  		position=None
  	):
  		
  
  		prev, next_ = get_ple_prev_next(
  			self.playlist_songs(playlist),
  			after=after,
  			before=before,
  			index=index,
  			position=position
  		)
  
  		if 'storeId' in song:
  			song_id = song['storeId']
  		elif 'trackId' in song:
  			song_id = song['trackId']
  		else:
  			song_id = song['id']
  
  		mutation = mc_calls.PlaylistEntriesBatch.create(
  			song_id, playlist['id'],
  			preceding_entry_id=prev.get('id'),
  			following_entry_id=next_.get('id')
  		)
  		self._call(mc_calls.PlaylistEntriesBatch, mutation)
  
  		return self.playlist(playlist['id'], include_songs=True)
docs: Add a song to a playlist.
  
  		Note:
  			* Provide no optional arguments to add to end.
  			* Provide playlist song dicts for ``after`` and/or ``before``.
  			* Provide a zero-based ``index``.
  			* Provide a one-based ``position``.
  
  			Songs are inserted *at* given index or position.
  			It's also possible to add to the end by using
  			``len(songs)`` for index or ``len(songs) + 1`` for position.
  
  		Parameters:
  			song (dict): A song dict.
  			playlist (dict): A playlist dict.
  			after (dict, Optional): A playlist song dict ``songs`` will follow.
  			before (dict, Optional): A playlist song dict ``songs`` will precede.
  			index (int, Optional): The zero-based index position to insert ``song``.
  			position (int, Optional): The one-based position to insert ``song``.
  
  		Returns:
  			dict: Playlist dict including songs.