Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
cf506dd
prepare plexnet for pagination
pannal Aug 23, 2018
ee7da9b
add MLCPaginator and BaseRelatedPaginator
pannal Aug 23, 2018
a2187b1
add chevron-white-left icon
pannal Aug 23, 2018
4978fb4
add pagination for related items, episodes and postplay-ondeck
pannal Aug 23, 2018
334194c
move boundary elements further down; simplify list loading
pannal Aug 23, 2018
3527536
reset offset on paginator.reset as well
pannal Aug 28, 2018
8ffb25a
add missing progress indicator to subitems
pannal Aug 28, 2018
84e1055
add doc
pannal Aug 28, 2018
2dc4578
fix left/right padding for uneven episode counts
pannal Aug 31, 2018
e235d29
remove old updateRelated code; replaced with fillRelated
pannal Sep 5, 2018
7432915
implement RelatedPaginator watched/progress generically;
pannal Sep 5, 2018
300a410
pagination: use an initial page size of 18 and 8 for orphans
pannal Nov 14, 2018
cd65314
preplay: re-add correct video reload kwargs
pannal Nov 14, 2018
4512a14
fix error on episodes.onReInit
pannal Nov 14, 2018
63f2b6c
explicitly kill references to paginators and their parent windows
pannal Nov 16, 2018
2de05e3
episodes: don't re-setup paginators on reinit
pannal Nov 16, 2018
1e6b52d
related pagination: use 8 pages as base, 4 orphans
pannal Nov 16, 2018
7801579
episodes: allow round robin on unpaginated lists, on the first or las…
pannal Feb 8, 2019
ea89afc
episodes: allow round robin on paginated lists as well
pannal Feb 8, 2019
a45328d
paginator: use initial page when paginating left and the next page is…
pannal Feb 8, 2019
b1ec2ca
episodes: fix pagination when episode index is out of bounds
pannal Oct 23, 2019
da60319
episodes pagination: handle only two elements properly
pannal Oct 24, 2019
27e9d16
episodes pagination: properly select last played episode on reinit; s…
pannal Oct 24, 2019
8114d11
postplay: show unwatched state for onDeck
pannal Oct 24, 2019
caef8a7
fix preplay screen for shows without seasons
pannal May 22, 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
5 changes: 3 additions & 2 deletions lib/_included_packages/plexnet/plexobjects.py
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,9 @@ def init(self, container):
return self


def listItems(server, path, libtype=None, watched=None, bytag=False, data=None, container=None):
data = data if data is not None else server.query(path)
def listItems(server, path, libtype=None, watched=None, bytag=False, data=None, container=None, offset=None,
limit=None, **kwargs):
data = data if data is not None else server.query(path, offset=offset, limit=limit, **kwargs)
container = container or PlexContainer(data, path, server, path)
items = ItemContainer().init(container)

Expand Down
8 changes: 8 additions & 0 deletions lib/_included_packages/plexnet/plexserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,14 @@ def query(self, path, method=None, **kwargs):
plexapp.MANAGER.refreshResources(True)
return None

# add offset/limit
offset = kwargs.pop("offset", None)
limit = kwargs.pop("limit", None)
if offset is not None:
url = http.addUrlParam(url, "X-Plex-Container-Start=%s" % offset)
if limit is not None:
url = http.addUrlParam(url, "X-Plex-Container-Size=%s" % limit)

util.LOG('{0} {1}'.format(method.__name__.upper(), re.sub('X-Plex-Token=[^&]+', 'X-Plex-Token=****', url)))
try:
response = method(url, **kwargs)
Expand Down
58 changes: 43 additions & 15 deletions lib/_included_packages/plexnet/video.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,41 @@ def available(self):
return self.media()[0].isAccessible()


class PlayableVideo(Video):
class RelatedMixin(object):
_relatedCount = None

@property
def relatedCount(self):
if self._relatedCount is None:
self._relatedCount = self.getRelated(0, 0).totalSize

return self._relatedCount

@property
def related(self):
return self.getRelated(0, 8)

def getRelated(self, offset=None, limit=None, _max=36):
path = '/library/metadata/%s/similar' % self.ratingKey
return plexobjects.listItems(self.server, path, offset=offset, limit=limit, params={"count": _max})


class SectionOnDeckMixin(object):
_sectionOnDeckCount = None

def sectionOnDeck(self, offset=None, limit=None):
query = '/library/sections/{0}/onDeck'.format(self.getLibrarySectionId())
return plexobjects.listItems(self.server, query, offset=offset, limit=limit)

@property
def sectionOnDeckCount(self):
if self._sectionOnDeckCount is None:
self._sectionOnDeckCount = self.sectionOnDeck(0, 0).totalSize

return self._sectionOnDeckCount


class PlayableVideo(Video, RelatedMixin):
TYPE = None

def _setData(self, data):
Expand Down Expand Up @@ -221,7 +255,7 @@ def _setData(self, data):
self.producers = plexobjects.PlexItemList(data, media.Producer, media.Producer.TYPE, server=self.server)
self.roles = plexobjects.PlexItemList(data, media.Role, media.Role.TYPE, server=self.server, container=self.container)
self.writers = plexobjects.PlexItemList(data, media.Writer, media.Writer.TYPE, server=self.server)
self.related = plexobjects.PlexItemList(data.find('Related'), plexlibrary.Hub, plexlibrary.Hub.TYPE, server=self.server, container=self)
#self.related = plexobjects.PlexItemList(data.find('Related'), plexlibrary.Hub, plexlibrary.Hub.TYPE, server=self.server, container=self)
else:
if data.find(media.Media.TYPE) is not None:
self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, initpath=self.initpath, server=self.server, media=self)
Expand Down Expand Up @@ -275,15 +309,15 @@ def getStreamURL(self, **params):


@plexobjects.registerLibType
class Show(Video):
class Show(Video, RelatedMixin, SectionOnDeckMixin):
TYPE = 'show'

def _setData(self, data):
Video._setData(self, data)
if self.isFullObject():
self.genres = plexobjects.PlexItemList(data, media.Genre, media.Genre.TYPE, server=self.server)
self.roles = plexobjects.PlexItemList(data, media.Role, media.Role.TYPE, server=self.server, container=self.container)
self.related = plexobjects.PlexItemList(data.find('Related'), plexlibrary.Hub, plexlibrary.Hub.TYPE, server=self.server, container=self)
#self.related = plexobjects.PlexItemList(data.find('Related'), plexlibrary.Hub, plexlibrary.Hub.TYPE, server=self.server, container=self)
self.extras = PlexVideoItemList(data.find('Extras'), initpath=self.initpath, server=self.server, container=self)

@property
Expand Down Expand Up @@ -322,10 +356,6 @@ def unwatched(self):
def refresh(self):
self.server.query('/library/metadata/%s/refresh' % self.ratingKey)

def sectionOnDeck(self):
query = '/library/sections/{0}/onDeck'.format(self.getLibrarySectionId())
return plexobjects.listItems(self.server, query)


@plexobjects.registerLibType
class Season(Video):
Expand All @@ -348,9 +378,9 @@ def unViewedLeafCount(self):
def isWatched(self):
return self.viewedLeafCount == self.leafCount

def episodes(self, watched=None):
def episodes(self, watched=None, offset=None, limit=None):
path = self.key
return plexobjects.listItems(self.server, path, watched=watched)
return plexobjects.listItems(self.server, path, watched=watched, offset=offset, limit=limit)

def episode(self, title):
path = self.key
Expand All @@ -370,7 +400,7 @@ def unwatched(self):


@plexobjects.registerLibType
class Episode(PlayableVideo):
class Episode(PlayableVideo, SectionOnDeckMixin):
TYPE = 'episode'

def init(self, data):
Expand Down Expand Up @@ -448,10 +478,8 @@ def genres(self):
def roles(self):
return self.show().roles

@property
def related(self):
self.show().reload(_soft=True, includeRelated=1, includeRelatedCount=10)
return self.show().related
def getRelated(self, offset=None, limit=None, _max=36):
return self.show().getRelated(offset=offset, limit=limit, _max=_max)


@plexobjects.registerLibType
Expand Down
Loading