def playlist_song_add(
		self,
		song,
		playlist,
		*,
		after=None,
		before=None,
		index=None,
		position=None
	):
		"""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.
		"""

		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)