Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
0dbdff4
create editAdvanced method
blacktwin Jun 5, 2020
afe25d1
create defaultAdvanced method
blacktwin Jun 5, 2020
2c256f8
add _initpath to Preferences atrributes
blacktwin Jun 5, 2020
0b31454
add _default method to Preferences class
blacktwin Jun 5, 2020
0974b1e
_default docstring
blacktwin Jun 5, 2020
d0975a8
docstrings for new methods.
blacktwin Jun 5, 2020
7474e7d
add editAdvanced method to library.LibrarySection
blacktwin Jun 10, 2020
59fcdb4
add defaultAdvanced method to library.LibrarySection
blacktwin Jun 10, 2020
e93d957
add test for show preferences
blacktwin Jun 18, 2020
fa54430
add test for editing show advanced setting then defaulting back
blacktwin Jun 18, 2020
7caee83
assert correction for defaulting show advanced settings
blacktwin Jun 18, 2020
c7baf71
add test for library settings
blacktwin Jun 18, 2020
38b863b
correction for library.librarySection.defaultAdvanced method
blacktwin Jun 18, 2020
ab41c1b
add test for editing library advanced setting then defaulting back.
blacktwin Jun 18, 2020
337ad9d
correct assertion for default and value comparision.
blacktwin Jul 27, 2020
5045ddc
removed deprecated _str function as py2 support has been dropped
blacktwin Jul 28, 2020
18973e2
update editAdvanced method to work with py2 drop
blacktwin Jul 28, 2020
620056a
update test_video_Show_editAdvanced_default to use 1 str/text and 1 i…
blacktwin Jul 28, 2020
56b6138
Merge branch 'master' into show_advanced_setting
blacktwin Sep 28, 2020
0123904
cleaning up test_settings.test_settings_get test
blacktwin Sep 28, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions plexapi/library.py
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,43 @@ def settings(self):
data = self._server.query(key)
return self.findItems(data, cls=Setting)

def editAdvanced(self, **kwargs):
""" Edit a library's advanced settings. """
data = {}
idEnums = {}
key = 'prefs[%s]'

for setting in self.settings():
if setting.type != 'bool':
idEnums[setting.id] = setting.enumValues
else:
idEnums[setting.id] = {0: False, 1: True}

for settingID, value in kwargs.items():
try:
enums = idEnums.get(settingID)
enumValues = [int(x) for x in enums]
except TypeError:
raise NotFound('%s not found in %s' % (value, list(idEnums.keys())))
if value in enumValues:
data[key % settingID] = value
else:
raise NotFound('%s not found in %s' % (value, enums))

self.edit(**data)

def defaultAdvanced(self):
""" Edit all of library's advanced settings to default. """
data = {}
key = 'prefs[%s]'
for setting in self.settings():
if setting.type == 'bool':
data[key % setting.id] = int(setting.default)
else:
data[key % setting.id] = setting.default

self.edit(**data)

def timeline(self):
""" Returns a timeline query for this library section. """
key = '/library/sections/%s/timeline' % self.key
Expand Down
13 changes: 9 additions & 4 deletions plexapi/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,11 @@ class Setting(PlexObject):
"""
_bool_cast = lambda x: True if x == 'true' or x == '1' else False
_bool_str = lambda x: str(x).lower()
_str = lambda x: str(x).encode('utf-8')
TYPES = {
'bool': {'type': bool, 'cast': _bool_cast, 'tostr': _bool_str},
'double': {'type': float, 'cast': float, 'tostr': _str},
'int': {'type': int, 'cast': int, 'tostr': _str},
'text': {'type': str, 'cast': _str, 'tostr': _str},
'double': {'type': float, 'cast': float, 'tostr': str},
'int': {'type': int, 'cast': int, 'tostr': str},
'text': {'type': str, 'cast': str, 'tostr': str},
}

def _loadData(self, data):
Expand Down Expand Up @@ -167,3 +166,9 @@ class Preferences(Setting):
"""
TAG = 'Preferences'
FILTER = 'preferences'

def _default(self):
""" Set the default value for this setting."""
key = '%s/prefs?' % self._initpath
url = key + '%s=%s' % (self.id, self.default)
self._server.query(url, method=self._server._session.put)
27 changes: 26 additions & 1 deletion plexapi/video.py
Original file line number Diff line number Diff line change
Expand Up @@ -453,10 +453,35 @@ def preferences(self):
data = self._server.query(self._details_key)
for item in data.iter('Preferences'):
for elem in item:
items.append(settings.Preferences(data=elem, server=self._server))
setting = settings.Preferences(data=elem, server=self._server)
setting._initpath = self.key
items.append(setting)

return items

def editAdvanced(self, **kwargs):
""" Edit a show's advanced settings. """
data = {}
key = '%s/prefs?' % self.key
preferences = {pref.id: list(pref.enumValues.keys()) for pref in self.preferences()}
for settingID, value in kwargs.items():
enumValues = preferences.get(settingID)
if value in enumValues:
data[settingID] = value
else:
raise NotFound('%s not found in %s' % (value, enumValues))
url = key + urlencode(data)
self._server.query(url, method=self._server._session.put)

def defaultAdvanced(self):
""" Edit all of show's advanced settings to default. """
data = {}
key = '%s/prefs?' % self.key
for preference in self.preferences():
data[preference.id] = preference.default
url = key + urlencode(data)
self._server.query(url, method=self._server._session.put)

def hubs(self):
""" Returns a list of :class:`~plexapi.library.Hub` objects. """
data = self._server.query(self._details_key)
Expand Down
22 changes: 22 additions & 0 deletions tests/test_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,28 @@ def test_library_and_section_search_for_movie(plex):
assert l_search == s_search


def test_library_settings(movies):
settings = movies.settings()
assert len(settings) >= 1


def test_library_editAdvanced_default(movies):
movies.editAdvanced(hidden=2)
for setting in movies.settings():
if setting.id == 'hidden':
assert int(setting.value) == 2

movies.editAdvanced(collectionMode=0)
for setting in movies.settings():
if setting.id == 'collectionMode':
assert int(setting.value) == 0

movies.reload()
movies.defaultAdvanced()
for setting in movies.settings():
assert int(setting.value) == int(setting.default)


def test_library_Collection_modeUpdate(collection):
mode_dict = {"default": "-2", "hide": "0", "hideItems": "1", "showItems": "2"}
for key, value in mode_dict.items():
Expand Down
6 changes: 1 addition & 5 deletions tests/test_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,8 @@ def test_settings_group(plex):


def test_settings_get(plex):
# This is the value since it we havnt set any friendlyname
# plex just default to computer name but it NOT in the settings.
# check this one. why is this bytes instead of string.
value = plex.settings.get("FriendlyName").value
# Should not be bytes, fix this when py2 is dropped
assert isinstance(value, bytes)
assert isinstance(value, str)


def test_settings_set(plex):
Expand Down
24 changes: 24 additions & 0 deletions tests/test_video.py
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,30 @@ def test_video_Show_location(plex):
assert len(show.locations) >= 1


def test_video_Show_settings(show):
preferences = show.preferences()
assert len(preferences) >= 1


def test_video_Show_editAdvanced_default(show):
show.editAdvanced(showOrdering='absolute')
show.reload()
for pref in show.preferences():
if pref.id == 'showOrdering':
assert pref.value == 'absolute'

show.editAdvanced(flattenSeasons=1)
show.reload()
for pref in show.preferences():
if pref.id == 'flattenSeasons':
assert pref.value == 1

show.defaultAdvanced()
show.reload()
for pref in show.preferences():
assert pref.value == pref.default


def test_video_Show_reload(plex):
show = plex.library.section("TV Shows").get("Game of Thrones")
assert utils.is_metadata(show._initpath, prefix="/library/sections/")
Expand Down