add optimize method

This commit is contained in:
blacktwin 2020-01-30 10:55:29 -05:00
parent 3a78234ae5
commit 8c2ea6f993

View file

@ -2,7 +2,7 @@
from plexapi import media, utils from plexapi import media, utils
from plexapi.exceptions import BadRequest, NotFound from plexapi.exceptions import BadRequest, NotFound
from plexapi.base import Playable, PlexPartialObject from plexapi.base import Playable, PlexPartialObject
from plexapi.compat import quote_plus from plexapi.compat import quote_plus, quote
import os import os
@ -126,6 +126,84 @@ class Video(PlexPartialObject):
return self.fetchItems('%s/posters' % self.key, cls=media.Poster) return self.fetchItems('%s/posters' % self.key, cls=media.Poster)
def optimize(self, title=None, target="", targetTagID=None, locationID=-1, policyScope='all',
policyValue="", policyUnwatched=0, videoQuality=None, deviceProfile=None):
""" Optimize item
locationID (int): -1 in folder with orginal items
2 library path
target (str): custom quality name.
if none provided use "Custom: {deviceProfile}"
targetTagID (int): Default quality settings
1 Mobile
2 TV
3 Original Quality
deviceProfile (str): Android, IOS, Universal TV, Universal Mobile, Windows Phone,
Windows, Xbox One
Example:
Optimize for Mobile
item.optimize(targetTagID="Mobile") or item.optimize(targetTagID=1")
Optimize for Android 10 MBPS 1080p
item.optimize(deviceProfile="Android", videoQuality=10)
Optimize for IOS Original Quality
item.optimize(deviceProfile="IOS", videoQuality=-1)
* see sync.py VIDEO_QUALITIES for additional information for using videoQuality
"""
tagValues = [1, 2, 3]
tagKeys = ["Mobile", "TV", "Original Quality"]
tagIDs = tagKeys + tagValues
if targetTagID not in tagIDs and (deviceProfile == None or videoQuality == None):
raise BadRequest('Unexpected or missing quality profile.')
from plexapi.sync import MediaSettings
if title is None:
title = self.title
key = '/playlists/1111/items?'
itemType = '%s=42' % quote_plus('Item[type]')
itemTitle = '&%s=%s' % (quote_plus('Item[title]'), quote(title))
itemTarget = '&%s=%s' % (quote_plus('Item[target]'), quote_plus(target))
if isinstance(targetTagID, str):
tagIndex = tagKeys.index(targetTagID)
targetTagID = tagValues[tagIndex]
itemTargetTagID = '&%s=%s' % (quote_plus('Item[targetTagID]'), targetTagID if targetTagID else "")
itemLocationID = '&%s=%s' % (quote_plus('Item[locationID]'), locationID)
section = self._server.library.sectionByID(self.librarySectionID)
location = '%s=%s%s%s' % (quote_plus('Item[Location][uri]'), quote_plus('library://'),
section.uuid, quote_plus('/item/'))
itemLocationUri = '&%s%s' % (location, quote_plus(quote_plus('%s' % self.key)))
itemPolicyScope = '&%s=%s' % (quote_plus('Item[Policy][scope]'), quote_plus(policyScope))
itemPolicyValue = '&%s=%s' % (quote_plus('Item[Policy][value]'), quote_plus(policyValue))
itemPolicyUnwatched = '&%s=%s' % (quote_plus('Item[Policy][unwatched]'), policyUnwatched)
data = key + itemType + itemTitle + itemTarget + itemTargetTagID + itemLocationID + \
itemLocationUri + '%253FincludeExternalMedia%253D1'
if deviceProfile:
data += '&%s=%s' % (quote_plus('Item[Device][profile]'), deviceProfile)
data += itemPolicyScope + itemPolicyValue + itemPolicyUnwatched
if videoQuality:
mediaSettings = MediaSettings.createVideo(videoQuality)
data += '&%s=%s' % (quote_plus('Item[MediaSettings][videoQuality]'), mediaSettings.videoQuality)
data += '&%s=%s' % (quote_plus('Item[MediaSettings][videoResolution]'), mediaSettings.videoResolution)
data += '&%s=%s' % (quote_plus('Item[MediaSettings][maxVideoBitrate]'), mediaSettings.maxVideoBitrate)
data += '&%s=%s' % (quote_plus('Item[MediaSettings][audioBoost]'), '')
data += '&%s=%s' % (quote_plus('Item[MediaSettings][subtitleSize]'), '')
data += '&%s=%s' % (quote_plus('Item[MediaSettings][musicBitrate]'), '')
data += '&%s=%s' % (quote_plus('Item[MediaSettings][photoQuality]'), '')
return self._server.query(data, method=self._server._session.put, headers={'X-Plex-Client-Identifier': "jzyhufx6t98rrjpce98b6irx"})
def sync(self, videoQuality, client=None, clientId=None, limit=None, unwatched=False, title=None): def sync(self, videoQuality, client=None, clientId=None, limit=None, unwatched=False, title=None):
""" Add current video (movie, tv-show, season or episode) as sync item for specified device. """ Add current video (movie, tv-show, season or episode) as sync item for specified device.
See :func:`plexapi.myplex.MyPlexAccount.sync()` for possible exceptions. See :func:`plexapi.myplex.MyPlexAccount.sync()` for possible exceptions.