|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | import re |
| 3 | +from itertools import groupby |
3 | 4 | from pathlib import Path |
4 | 5 | from urllib.parse import quote_plus, unquote |
5 | 6 |
|
@@ -212,19 +213,23 @@ def addItems(self, items): |
212 | 213 | if items and not isinstance(items, (list, tuple)): |
213 | 214 | items = [items] |
214 | 215 |
|
215 | | - ratingKeys = [] |
216 | | - for item in items: |
217 | | - if item.listType != self.playlistType: # pragma: no cover |
218 | | - raise BadRequest(f'Can not mix media types when building a playlist: ' |
219 | | - f'{self.playlistType} and {item.listType}') |
220 | | - ratingKeys.append(str(item.ratingKey)) |
| 216 | + # Group items by server to maintain order when adding items from multiple servers |
| 217 | + for server, _items in groupby(items, key=lambda item: item._server): |
221 | 218 |
|
222 | | - ratingKeys = ','.join(ratingKeys) |
223 | | - uri = f'{self._server._uriRoot()}/library/metadata/{ratingKeys}' |
| 219 | + ratingKeys = [] |
| 220 | + for item in _items: |
| 221 | + if item.listType != self.playlistType: # pragma: no cover |
| 222 | + raise BadRequest(f'Can not mix media types when building a playlist: ' |
| 223 | + f'{self.playlistType} and {item.listType}') |
| 224 | + ratingKeys.append(str(item.ratingKey)) |
| 225 | + |
| 226 | + ratingKeys = ','.join(ratingKeys) |
| 227 | + uri = f'{server._uriRoot()}/library/metadata/{ratingKeys}' |
| 228 | + |
| 229 | + args = {'uri': uri} |
| 230 | + key = f"{self.key}/items{utils.joinArgs(args)}" |
| 231 | + self._server.query(key, method=self._server._session.put) |
224 | 232 |
|
225 | | - args = {'uri': uri} |
226 | | - key = f"{self.key}/items{utils.joinArgs(args)}" |
227 | | - self._server.query(key, method=self._server._session.put) |
228 | 233 | return self |
229 | 234 |
|
230 | 235 | @deprecated('use "removeItems" instead') |
|
0 commit comments