PlexKodiConnect/resources/lib/plexnet/playlist.py
2018-09-30 13:16:17 +02:00

179 lines
4.4 KiB
Python

import random
import plexobjects
import signalsmixin
class BasePlaylist(plexobjects.PlexObject, signalsmixin.SignalsMixin):
TYPE = 'baseplaylist'
isRemote = False
def __init__(self, *args, **kwargs):
plexobjects.PlexObject.__init__(self, *args, **kwargs)
signalsmixin.SignalsMixin.__init__(self)
self._items = []
self._shuffle = None
self.pos = 0
self.startShuffled = False
self.isRepeat = False
self.isRepeatOne = False
def __getitem__(self, idx):
if self._shuffle:
return self._items[self._shuffle[idx]]
else:
return self._items[idx]
def __iter__(self):
if self._shuffle:
for i in self._shuffle:
yield self._items[i]
else:
for i in self._items:
yield i
def __len__(self):
return len(self._items)
def items(self):
if self._shuffle:
return [i for i in self]
else:
return self._items
def setRepeat(self, repeat, one=False):
if self.isRepeat == repeat and self.isRepeatOne == one:
return
self.isRepeat = repeat
self.isRepeatOne = one
def hasNext(self):
if len(self._items) < 2:
return False
if self.isRepeatOne:
return False
if self.isRepeat:
return True
return self.pos < len(self._items) - 1
def hasPrev(self):
if len(self._items) < 2:
return False
if self.isRepeatOne:
return False
if self.isRepeat:
return True
return self.pos > 0
def next(self):
if not self.hasNext():
return False
if self.isRepeatOne:
return True
self.pos += 1
if self.pos >= len(self._items):
self.pos = 0
return True
def prev(self):
if not self.hasPrev():
return False
if self.isRepeatOne:
return True
self.pos -= 1
if self.pos < 0:
self.pos = len(self._items) - 1
return True
def getPosFromItem(self, item):
if item not in self._items:
return -1
return self._items.index(item)
def setCurrent(self, pos):
if not isinstance(pos, int):
item = pos
pos = self.getPosFromItem(item)
self._items[pos] = item
if pos < 0 or pos >= len(self._items):
return False
self.pos = pos
return True
def current(self):
return self[self.pos]
def userCurrent(self):
for item in self._items:
if not item.isWatched or item.viewOffset.asInt():
return item
else:
return self.current()
def prevItem(self):
if self.pos < 1:
return None
return self[self.pos - 1]
def shuffle(self, on=True, first=False):
if on and self._items:
self._shuffle = range(len(self._items))
random.shuffle(self._shuffle)
if not first:
self.pos = self._shuffle.index(self.pos)
else:
if self._shuffle:
self.pos = self._shuffle[self.pos]
if not first:
self._shuffle = None
self.trigger('items.changed')
self.refresh()
def setShuffle(self, shuffle=None):
if shuffle is None:
shuffle = not self.isShuffled
self.shuffle(shuffle)
@property
def isShuffled(self):
return bool(self._shuffle)
def refresh(self, *args, **kwargs):
self.trigger('change')
class LocalPlaylist(BasePlaylist):
TYPE = 'localplaylist'
def __init__(self, items, server, media_item=None):
BasePlaylist.__init__(self, None, server=server)
self._items = items
self._mediaItem = media_item
def __getattr__(self, name):
if not self._mediaItem:
return BasePlaylist.__getattr__(self, name)
return getattr(self._mediaItem, name)
def get(self, name, default=''):
if not self._mediaItem:
return BasePlaylist.get(self, name, default)
return self._mediaItem.get(name, default)
@property
def defaultArt(self):
if not self._mediaItem:
return super(LocalPlaylist, self).defaultArt
return self._mediaItem.defaultArt