|
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