|
2 | 2 | from plexapi import media, utils |
3 | 3 | from plexapi.exceptions import BadRequest, NotFound |
4 | 4 | from plexapi.base import Playable, PlexPartialObject |
5 | | -from plexapi.compat import quote_plus, quote |
| 5 | +from plexapi.compat import quote_plus, quote, urlencode |
6 | 6 | import os |
7 | 7 |
|
8 | 8 |
|
@@ -161,47 +161,44 @@ def optimize(self, title=None, target="", targetTagID=None, locationID=-1, polic |
161 | 161 | if targetTagID not in tagIDs and (deviceProfile == None or videoQuality == None): |
162 | 162 | raise BadRequest('Unexpected or missing quality profile.') |
163 | 163 |
|
164 | | - from plexapi.sync import MediaSettings |
165 | | - |
166 | | - if title is None: |
167 | | - title = self.title |
168 | | - |
169 | | - key = '/playlists/1111/items?' |
170 | | - itemType = '%s=42' % quote_plus('Item[type]') |
171 | | - itemTitle = '&%s=%s' % (quote_plus('Item[title]'), quote(title)) |
172 | | - itemTarget = '&%s=%s' % (quote_plus('Item[target]'), quote_plus(target)) |
173 | 164 | if isinstance(targetTagID, str): |
174 | 165 | tagIndex = tagKeys.index(targetTagID) |
175 | 166 | targetTagID = tagValues[tagIndex] |
176 | 167 |
|
177 | | - itemTargetTagID = '&%s=%s' % (quote_plus('Item[targetTagID]'), targetTagID if targetTagID else "") |
178 | | - itemLocationID = '&%s=%s' % (quote_plus('Item[locationID]'), locationID) |
179 | | - section = self._server.library.sectionByID(self.librarySectionID) |
180 | | - location = '%s=%s%s%s' % (quote_plus('Item[Location][uri]'), quote_plus('library://'), |
181 | | - section.uuid, quote_plus('/item/')) |
182 | | - itemLocationUri = '&%s%s' % (location, quote_plus(quote_plus('%s' % self.key))) |
183 | | - itemPolicyScope = '&%s=%s' % (quote_plus('Item[Policy][scope]'), quote_plus(policyScope)) |
184 | | - itemPolicyValue = '&%s=%s' % (quote_plus('Item[Policy][value]'), quote_plus(policyValue)) |
185 | | - itemPolicyUnwatched = '&%s=%s' % (quote_plus('Item[Policy][unwatched]'), policyUnwatched) |
| 168 | + if title is None: |
| 169 | + title = self.title |
186 | 170 |
|
187 | | - data = key + itemType + itemTitle + itemTarget + itemTargetTagID + itemLocationID + \ |
188 | | - itemLocationUri + '%253FincludeExternalMedia%253D1' |
| 171 | + key = '/playlists/1111/items?' |
| 172 | + params = { |
| 173 | + 'Item[type]': 42, |
| 174 | + 'Item[target]': target, |
| 175 | + 'Item[targetTagID]': targetTagID if targetTagID else '', |
| 176 | + 'Item[locationID]': locationID, |
| 177 | + 'Item[Policy][scope]': policyScope, |
| 178 | + 'Item[Policy][value]': policyValue, |
| 179 | + 'Item[Policy][unwatched]': policyUnwatched |
| 180 | + } |
189 | 181 |
|
190 | 182 | if deviceProfile: |
191 | | - data += '&%s=%s' % (quote_plus('Item[Device][profile]'), deviceProfile) |
192 | | - |
193 | | - data += itemPolicyScope + itemPolicyValue + itemPolicyUnwatched |
| 183 | + params['Item[Device][profile]'] = deviceProfile |
194 | 184 |
|
195 | 185 | if videoQuality: |
| 186 | + from plexapi.sync import MediaSettings |
196 | 187 | mediaSettings = MediaSettings.createVideo(videoQuality) |
197 | | - data += '&%s=%s' % (quote_plus('Item[MediaSettings][videoQuality]'), mediaSettings.videoQuality) |
198 | | - data += '&%s=%s' % (quote_plus('Item[MediaSettings][videoResolution]'), mediaSettings.videoResolution) |
199 | | - data += '&%s=%s' % (quote_plus('Item[MediaSettings][maxVideoBitrate]'), mediaSettings.maxVideoBitrate) |
200 | | - data += '&%s=%s' % (quote_plus('Item[MediaSettings][audioBoost]'), '') |
201 | | - data += '&%s=%s' % (quote_plus('Item[MediaSettings][subtitleSize]'), '') |
202 | | - data += '&%s=%s' % (quote_plus('Item[MediaSettings][musicBitrate]'), '') |
203 | | - data += '&%s=%s' % (quote_plus('Item[MediaSettings][photoQuality]'), '') |
| 188 | + params['Item[MediaSettings][videoQuality]'] = mediaSettings.videoQuality |
| 189 | + params['Item[MediaSettings][videoResolution]'] = mediaSettings.videoResolution |
| 190 | + params['Item[MediaSettings][maxVideoBitrate]'] = mediaSettings.maxVideoBitrate |
| 191 | + params['Item[MediaSettings][audioBoost]'] = '' |
| 192 | + params['Item[MediaSettings][subtitleSize]'] = '' |
| 193 | + params['Item[MediaSettings][musicBitrate]'] = '' |
| 194 | + params['Item[MediaSettings][photoQuality]'] = '' |
| 195 | + |
| 196 | + titleParam = {'Item[title]': title} |
| 197 | + section = self._server.library.sectionByID(self.librarySectionID) |
| 198 | + params['Item[Location][uri]'] = 'library://' + section.uuid + '/item/' + \ |
| 199 | + quote_plus(self.key + '?includeExternalMedia=1') |
204 | 200 |
|
| 201 | + data = key + urlencode(params) + '&' + urlencode(titleParam, quote_via=quote) |
205 | 202 | return self._server.query(data, method=self._server._session.put) |
206 | 203 |
|
207 | 204 | def sync(self, videoQuality, client=None, clientId=None, limit=None, unwatched=False, title=None): |
|
0 commit comments