docs: def playlist_songs_move(
  		self,
  		playlist_songs,
  		*,
  		after=None,
  		before=None,
  		index=None,
  		position=None
  	):
  		"""Move songs in a playlist.
  
  		Note:
  			* Provide no optional arguments to move 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 move to the end by using
  			``len(songs)`` for index or ``len(songs) + 1`` for position.
  
  		Parameters:
  			playlist_songs (list): A list of playlist song dicts.
  			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 ``songs``.
  			position (int, Optional): The one-based position to insert ``songs``.
  
  		Returns:
  			dict: Playlist dict including songs.
  		"""
  
  		if not more_itertools.all_equal(
  			playlist_song['playlistId']
  			for playlist_song in playlist_songs
  		):
  			raise ValueError(
  				"All 'playlist_songs' must be from the same playlist."
  			)
  
  		playlist = self.playlist(
  			playlist_songs[0]['playlistId'],
  			include_songs=True
  		)
  
  		prev, next_ = get_ple_prev_next(
  			playlist['tracks'],
  			after=after,
  			before=before,
  			index=index,
  			position=position
  		)
  
  		playlist_songs_len = len(playlist_songs)
  		for i, playlist_song in enumerate(playlist_songs):
  			mutation = mc_calls.PlaylistEntriesBatch.update(
  				playlist_song,
  				preceding_entry_id=prev.get('id'),
  				following_entry_id=next_.get('id')
  			)
  			response = self._call(mc_calls.PlaylistEntriesBatch, mutation)
  			result = response.body['mutate_response'][0]
  
  			# TODO: Proper exception on failure.
  			if result['response_code'] != 'OK':
  				break
  
  			if i < playlist_songs_len - 1:
  				while True:
  					prev = self.playlist_song(result['id'])
  					if prev:
  						break
  
  		return self.playlist(playlist_songs[0]['playlistId'], include_songs=True)