diff --git a/lib/plexapi/media.py b/lib/plexapi/media.py index e827853f..990f34b4 100644 --- a/lib/plexapi/media.py +++ b/lib/plexapi/media.py @@ -821,6 +821,27 @@ class Chapter(PlexObject): self.end = cast(int, data.attrib.get('endTimeOffset')) +@utils.registerPlexObject +class Marker(PlexObject): + """ Represents a single Marker media tag. + Attributes: + TAG (str): 'Marker' + """ + TAG = 'Marker' + + def __repr__(self): + name = self._clean(self.firstAttr('type')) + start = utils.millisecondToHumanstr(self._clean(self.firstAttr('start'))) + end = utils.millisecondToHumanstr(self._clean(self.firstAttr('end'))) + return '<%s:%s %s - %s>' % (self.__class__.__name__, name, start, end) + + def _loadData(self, data): + self._data = data + self.type = data.attrib.get('type') + self.start = cast(int, data.attrib.get('startTimeOffset')) + self.end = cast(int, data.attrib.get('endTimeOffset')) + + @utils.registerPlexObject class Field(PlexObject): """ Represents a single Field. diff --git a/lib/plexapi/video.py b/lib/plexapi/video.py index d12ce4ad..f7bb71ed 100644 --- a/lib/plexapi/video.py +++ b/lib/plexapi/video.py @@ -699,6 +699,7 @@ class Episode(Playable, Video): self.labels = self.findItems(data, media.Label) self.collections = self.findItems(data, media.Collection) self.chapters = self.findItems(data, media.Chapter) + self.markers = self.findItems(data, media.Marker) def __repr__(self): return '<%s>' % ':'.join([p for p in [ @@ -730,6 +731,13 @@ class Episode(Playable, Video): """ Returns the s00e00 string containing the season and episode. """ return 's%se%s' % (str(self.seasonNumber).zfill(2), str(self.index).zfill(2)) + @property + def hasIntroMarker(self): + """ Returns True if this episode has an intro marker in the xml. """ + if not self.isFullObject(): + self.reload() + return any(marker.type == 'intro' for marker in self.markers) + def season(self): """" Return this episodes :func:`~plexapi.video.Season`.. """ return self.fetchItem(self.parentKey)