Skip to content

Commit 0620eb4

Browse files
authored
Fix Agent object settings (#864)
* Fix mediaType argument for PlexServer.agents() * Cleanup Agent and AgentMediaType attributes * Add `DeprecationWarning` to `languageCode` * Make Agent.settings() method public * Add `DeprecationWarning` to `Agent._settings()` * Fix parsing Setting.enumValues * XML attribute for agent settings uses `values` instead of `enumValues` * Add secure and option attributes to Setting * Add test for server agents
1 parent d2c849f commit 0620eb4

File tree

5 files changed

+55
-21
lines changed

5 files changed

+55
-21
lines changed

plexapi/library.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ def hubs(self):
631631
def agents(self):
632632
""" Returns a list of available :class:`~plexapi.media.Agent` for this library section.
633633
"""
634-
return self._server.agents(utils.searchType(self.type))
634+
return self._server.agents(self.type)
635635

636636
def settings(self):
637637
""" Returns a list of all library settings. """

plexapi/media.py

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from plexapi import log, settings, utils
77
from plexapi.base import PlexObject
88
from plexapi.exceptions import BadRequest
9+
from plexapi.utils import deprecated
910

1011

1112
@utils.registerPlexObject
@@ -1058,31 +1059,50 @@ def _loadData(self, data):
10581059
self.hasAttribution = data.attrib.get('hasAttribution')
10591060
self.hasPrefs = data.attrib.get('hasPrefs')
10601061
self.identifier = data.attrib.get('identifier')
1062+
self.name = data.attrib.get('name')
10611063
self.primary = data.attrib.get('primary')
10621064
self.shortIdentifier = self.identifier.rsplit('.', 1)[1]
1065+
10631066
if 'mediaType' in self._initpath:
1064-
self.name = data.attrib.get('name')
1065-
self.languageCode = []
1066-
for code in data:
1067-
self.languageCode += [code.attrib.get('code')]
1067+
self.languageCodes = self.listAttrs(data, 'code', etag='Language')
1068+
self.mediaTypes = []
10681069
else:
1069-
self.mediaTypes = [AgentMediaType(server=self._server, data=d) for d in data]
1070+
self.languageCodes = []
1071+
self.mediaTypes = self.findItems(data, cls=AgentMediaType)
10701072

1071-
def _settings(self):
1073+
@property
1074+
@deprecated('use "languageCodes" instead')
1075+
def languageCode(self):
1076+
return self.languageCodes
1077+
1078+
def settings(self):
10721079
key = '/:/plugins/%s/prefs' % self.identifier
10731080
data = self._server.query(key)
10741081
return self.findItems(data, cls=settings.Setting)
10751082

1083+
@deprecated('use "settings" instead')
1084+
def _settings(self):
1085+
return self.settings()
1086+
10761087

10771088
class AgentMediaType(Agent):
1089+
""" Represents a single Agent MediaType.
1090+
1091+
Attributes:
1092+
TAG (str): 'MediaType'
1093+
"""
1094+
TAG = 'MediaType'
10781095

10791096
def __repr__(self):
10801097
uid = self._clean(self.firstAttr('name'))
10811098
return '<%s>' % ':'.join([p for p in [self.__class__.__name__, uid] if p])
10821099

10831100
def _loadData(self, data):
1101+
self.languageCodes = self.listAttrs(data, 'code', etag='Language')
10841102
self.mediaType = utils.cast(int, data.attrib.get('mediaType'))
10851103
self.name = data.attrib.get('name')
1086-
self.languageCode = []
1087-
for code in data:
1088-
self.languageCode += [code.attrib.get('code')]
1104+
1105+
@property
1106+
@deprecated('use "languageCodes" instead')
1107+
def languageCode(self):
1108+
return self.languageCodes

plexapi/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,10 @@ def activities(self):
229229
return activities
230230

231231
def agents(self, mediaType=None):
232-
""" Returns the :class:`~plexapi.media.Agent` objects this server has available. """
232+
""" Returns a list of :class:`~plexapi.media.Agent` objects this server has available. """
233233
key = '/system/agents'
234234
if mediaType:
235-
key += '?mediaType=%s' % mediaType
235+
key += '?mediaType=%s' % utils.searchType(mediaType)
236236
return self.fetchItems(key)
237237

238238
def createToken(self, type='delegation', scope='all'):

plexapi/settings.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,19 @@ class Setting(PlexObject):
113113

114114
def _loadData(self, data):
115115
""" Load attribute values from Plex XML response. """
116-
self._setValue = None
116+
self.type = data.attrib.get('type')
117+
self.advanced = utils.cast(bool, data.attrib.get('advanced'))
118+
self.default = self._cast(data.attrib.get('default'))
119+
self.enumValues = self._getEnumValues(data)
120+
self.group = data.attrib.get('group')
121+
self.hidden = utils.cast(bool, data.attrib.get('hidden'))
117122
self.id = data.attrib.get('id')
118123
self.label = data.attrib.get('label')
124+
self.option = data.attrib.get('option')
125+
self.secure = utils.cast(bool, data.attrib.get('secure'))
119126
self.summary = data.attrib.get('summary')
120-
self.type = data.attrib.get('type')
121-
self.default = self._cast(data.attrib.get('default'))
122127
self.value = self._cast(data.attrib.get('value'))
123-
self.hidden = utils.cast(bool, data.attrib.get('hidden'))
124-
self.advanced = utils.cast(bool, data.attrib.get('advanced'))
125-
self.group = data.attrib.get('group')
126-
self.enumValues = self._getEnumValues(data)
128+
self._setValue = None
127129

128130
def _cast(self, value):
129131
""" Cast the specific value to the type of this setting. """
@@ -132,8 +134,8 @@ def _cast(self, value):
132134
return value
133135

134136
def _getEnumValues(self, data):
135-
""" Returns a list of dictionary of valis value for this setting. """
136-
enumstr = data.attrib.get('enumValues')
137+
""" Returns a list or dictionary of values for this setting. """
138+
enumstr = data.attrib.get('enumValues') or data.attrib.get('values')
137139
if not enumstr:
138140
return None
139141
if ':' in enumstr:

tests/test_server.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,3 +571,15 @@ def test_server_PlexWebURL_playlists(plex):
571571
assert plex.machineIdentifier in url
572572
assert 'source=playlists' in url
573573
assert 'pivot=playlists.%s' % tab in url
574+
575+
576+
def test_server_agents(plex):
577+
agents = plex.agents()
578+
assert agents
579+
agent = next((a for a in agents if a.identifier == 'com.plexapp.agents.imdb'), None)
580+
assert agent
581+
settings = agent.settings()
582+
assert settings
583+
setting = next((s for s in settings if s.id == 'country'), None)
584+
assert setting
585+
assert setting.enumValues is not None

0 commit comments

Comments
 (0)