Skip to content

Commit f70cf7b

Browse files
committed
- use explicit setters in InfoTagVideo instead of ListItem.setInfo()
1 parent f3cf4f4 commit f70cf7b

File tree

2 files changed

+90
-118
lines changed

2 files changed

+90
-118
lines changed

changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- support actor thumbnails
55
- add advanced option to change the URL of a media provider
66
- pass the retrieved items in chunks back to Kodi
7+
- use explicit setters in InfoTagVideo instead of ListItem.setInfo()
78

89
[B]Version 0.0.8[/B]
910
- properly handle empty movie collections (fixes #25)

plex/api.py

Lines changed: 89 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -493,37 +493,16 @@ def fillVideoInfos(
493493
:param allowDirectPlay: Settings definition on provider if directPlay is allowed
494494
:type allowDirectPlay: bool, optional
495495
"""
496-
info = {
497-
'mediatype': mediaType,
498-
'path': '',
499-
'filenameandpath': '',
500-
'title': item.getLabel() or '',
501-
'sorttitle': '',
502-
'originaltitle': '',
503-
'plot': plexItem.summary or '',
504-
'dateadded': Api.convertDateTimeToDbDateTime(plexItem.addedAt),
505-
'year': 0,
506-
'set': '',
507-
'rating': 0.0,
508-
'userrating': 0.0,
509-
'mpaa': '',
510-
'duration': 0,
511-
'playcount': 0,
512-
'lastplayed': '',
513-
'director': [],
514-
'writer': [],
515-
'genre': [],
516-
'country': [],
517-
'tag': []
518-
}
496+
videoInfoTag = item.getVideoInfoTag()
497+
498+
videoInfoTag.setMediaType(mediaType)
499+
videoInfoTag.setTitle(item.getLabel() or '')
519500

520501
date = None
521502
isFolder = False
522503

523-
resumePoint = {
524-
'totaltime': 0,
525-
'resumetime': 0
526-
}
504+
resumeTime = 0.0
505+
duration = 0.0
527506

528507
artwork = {}
529508
collections = []
@@ -532,89 +511,89 @@ def fillVideoInfos(
532511
roles = []
533512

534513
if isinstance(plexItem, video.Video):
535-
info.update({
536-
'sorttitle': plexItem.titleSort,
537-
'playcount': plexItem.viewCount,
538-
'lastplayed': Api.convertDateTimeToDbDateTime(plexItem.lastViewedAt),
539-
})
540-
info['tag'].append(plexItem.librarySectionTitle)
514+
videoInfoTag.setSortTitle(plexItem.titleSort)
515+
videoInfoTag.setPlot(plexItem.summary or '')
516+
videoInfoTag.setDateAdded(Api.convertDateTimeToDbDateTime(plexItem.addedAt))
517+
videoInfoTag.setPlaycount(plexItem.viewCount)
518+
videoInfoTag.setLastPlayed(Api.convertDateTimeToDbDateTime(plexItem.lastViewedAt))
519+
videoInfoTag.setTags([plexItem.librarySectionTitle])
541520

542521
if isinstance(plexItem, video.Movie):
543-
info.update({
544-
'mpaa': plexItem.contentRating or '',
545-
'duration': Api.MillisecondsToSeconds(plexItem.duration),
546-
'originaltitle': plexItem.originalTitle or '',
547-
'premiered': Api.convertDateTimeToDbDate(plexItem.originallyAvailableAt),
548-
'rating': plexItem.rating or 0.0,
549-
'studio': Api.ListFromString(plexItem.studio),
550-
'tagline': plexItem.tagline or '',
551-
'userrating': plexItem.userRating or 0.0,
552-
'year': plexItem.year or 0,
553-
'country': Api.ListFromMediaTags(plexItem.countries),
554-
'director': Api.ListFromMediaTags(plexItem.directors),
555-
'genre': Api.ListFromMediaTags(plexItem.genres),
556-
'writer': Api.ListFromMediaTags(plexItem.writers),
557-
})
558-
559-
date = info['premiered']
560-
resumePoint['resumetime'] = Api.MillisecondsToSeconds(plexItem.viewOffset)
522+
date = Api.convertDateTimeToDbDate(plexItem.originallyAvailableAt)
523+
duration = Api.MillisecondsToSeconds(plexItem.duration)
524+
resumeTime = Api.MillisecondsToSeconds(plexItem.viewOffset)
561525
collections = plexItem.collections
562526
media = plexItem.media
563527
roles = plexItem.roles
528+
529+
videoInfoTag.setMpaa(plexItem.contentRating or '')
530+
videoInfoTag.setDuration(int(duration))
531+
videoInfoTag.setOriginalTitle(plexItem.originalTitle or '')
532+
videoInfoTag.setPremiered(date)
533+
videoInfoTag.setRating(plexItem.rating or 0.0)
534+
videoInfoTag.setTagLine(plexItem.tagline or '')
535+
videoInfoTag.setUserRating(int(plexItem.userRating or 0))
536+
videoInfoTag.setYear(plexItem.year or 0)
537+
videoInfoTag.setStudios(Api.ListFromString(plexItem.studio))
538+
videoInfoTag.setCountries(Api.ListFromMediaTags(plexItem.countries))
539+
videoInfoTag.setGenres(Api.ListFromMediaTags(plexItem.genres))
540+
videoInfoTag.setDirectors(Api.ListFromMediaTags(plexItem.directors))
541+
videoInfoTag.setWriters(Api.ListFromMediaTags(plexItem.writers))
564542
elif isinstance(plexItem, library.Collections):
565543
# ignore empty collections
566544
if plexItem.childCount <= 0:
567545
return
546+
568547
isFolder = True
548+
549+
videoInfoTag.setPlot(plexItem.summary or '')
550+
videoInfoTag.setDateAdded(Api.convertDateTimeToDbDateTime(plexItem.addedAt))
569551
elif isinstance(plexItem, video.Show):
570-
info.update({
571-
'mpaa': plexItem.contentRating or '',
572-
'duration': Api.MillisecondsToSeconds(plexItem.duration),
573-
'premiered': Api.convertDateTimeToDbDate(plexItem.originallyAvailableAt),
574-
'rating': plexItem.rating or 0.0,
575-
'studio': Api.ListFromString(plexItem.studio),
576-
'year': plexItem.year or 0,
577-
'genre': Api.ListFromMediaTags(plexItem.genres),
578-
})
579-
580-
date = info['premiered']
581552
isFolder = True
553+
date = Api.convertDateTimeToDbDate(plexItem.originallyAvailableAt)
554+
duration = Api.MillisecondsToSeconds(plexItem.duration)
582555
locations = plexItem.locations
583556
collections = plexItem.collections
584557
roles = plexItem.roles
585558

586559
banner = plexItem.banner
587560
if banner:
588561
artwork['banner'] = plexServer.url(banner, includeToken=True)
562+
563+
videoInfoTag.setMpaa(plexItem.contentRating or '')
564+
videoInfoTag.setDuration(int(duration))
565+
videoInfoTag.setPremiered(date)
566+
videoInfoTag.setRating(plexItem.rating or 0.0)
567+
videoInfoTag.setYear(plexItem.year or 0)
568+
videoInfoTag.setStudios(Api.ListFromString(plexItem.studio))
569+
videoInfoTag.setGenres(Api.ListFromMediaTags(plexItem.genres))
589570
elif isinstance(plexItem, video.Season):
590-
info.update({
591-
'tvshowtitle': plexItem.parentTitle or '',
592-
'season': plexItem.index,
593-
})
594571
isFolder = True
572+
573+
videoInfoTag.setTvShowTitle(plexItem.parentTitle or '')
574+
videoInfoTag.setSeason(plexItem.index)
595575
elif isinstance(plexItem, video.Episode):
596-
info.update({
597-
'tvshowtitle': plexItem.grandparentTitle or '',
598-
'season': plexItem.parentIndex,
599-
'episode': plexItem.index,
600-
'mpaa': plexItem.contentRating or '',
601-
'duration': Api.MillisecondsToSeconds(plexItem.duration),
602-
'aired': Api.convertDateTimeToDbDate(plexItem.originallyAvailableAt),
603-
'rating': plexItem.rating or 0.0,
604-
'year': plexItem.year or 0,
605-
'director': Api.ListFromMediaTags(plexItem.directors),
606-
'writer': Api.ListFromMediaTags(plexItem.writers),
607-
})
608-
609-
date = info['aired']
610-
resumePoint['resumetime'] = Api.MillisecondsToSeconds(plexItem.viewOffset)
576+
date = Api.convertDateTimeToDbDate(plexItem.originallyAvailableAt)
577+
resumeTime = Api.MillisecondsToSeconds(plexItem.viewOffset)
578+
duration = Api.MillisecondsToSeconds(plexItem.duration)
611579
media = plexItem.media
612580

581+
videoInfoTag.setTvShowTitle(plexItem.grandparentTitle or '')
582+
videoInfoTag.setSeason(int(plexItem.parentIndex))
583+
videoInfoTag.setEpisode(plexItem.index)
584+
videoInfoTag.setMpaa(plexItem.contentRating or '')
585+
videoInfoTag.setDuration(int(duration))
586+
videoInfoTag.setFirstAired(date)
587+
videoInfoTag.setRating(plexItem.rating or 0.0)
588+
videoInfoTag.setYear(plexItem.year or 0)
589+
videoInfoTag.setDirectors(Api.ListFromMediaTags(plexItem.directors))
590+
videoInfoTag.setWriters(Api.ListFromMediaTags(plexItem.writers))
591+
613592
# handle collections / sets
614593
collections = Api.ListFromMediaTags(collections)
615594
if collections:
616595
# Kodi can only store one set per media item
617-
info['set'] = collections[0]
596+
videoInfoTag.setSet(collections[0])
618597

619598
# set the item's datetime if available
620599
if date:
@@ -624,26 +603,21 @@ def fillVideoInfos(
624603
item.setIsFolder(isFolder)
625604

626605
# add the item's ID as a unique ID belonging to Plex
627-
item.getVideoInfoTag().setUniqueIDs({
628-
PLEX_PROTOCOL: itemId
606+
videoInfoTag.setUniqueIDs({
607+
PLEX_PROTOCOL: str(itemId)
629608
}, PLEX_PROTOCOL)
630609

631610
# handle actors / cast
632611
cast = []
633612
for index, role in enumerate(roles):
634-
cast.append({
635-
'name': role.tag.strip(),
636-
'role': role.role.strip(),
637-
'order': index,
638-
'thumbnail': role.thumb,
639-
})
613+
actor = xbmc.Actor(role.tag.strip(), role.role.strip(), index, role.thumb)
614+
cast.append(actor)
640615
if cast:
641-
item.setCast(cast)
616+
videoInfoTag.setCast(cast)
642617

643618
# handle resume point
644-
if resumePoint['resumetime'] > 0 and info['duration'] > 0:
645-
resumePoint['totaltime'] = info['duration']
646-
item.setProperties(resumePoint)
619+
if resumeTime > 0 and duration > 0.0:
620+
videoInfoTag.setResumePoint(resumeTime, duration)
647621

648622
# handle stream details
649623
mediaPart = None
@@ -654,33 +628,30 @@ def fillVideoInfos(
654628
mediaPart = part
655629

656630
for videoStream in part.videoStreams():
657-
item.addStreamInfo('video', {
658-
'codec': videoStream.codec,
659-
'language': videoStream.language,
660-
'width': videoStream.width,
661-
'height': videoStream.height,
662-
'duration': info['duration']
663-
})
631+
videoInfoTag.addVideoStream(xbmc.VideoStreamDetail(
632+
width=videoStream.width,
633+
height=videoStream.height,
634+
codec=videoStream.codec,
635+
duration=int(duration),
636+
language=videoStream.language
637+
))
664638

665639
for audioStream in part.audioStreams():
666-
item.addStreamInfo(
667-
'audio', {
668-
'codec': audioStream.codec,
669-
'language': audioStream.language,
670-
'channels': audioStream.channels
671-
}
672-
)
640+
videoInfoTag.addAudioStream(xbmc.AudioStreamDetail(
641+
channels=audioStream.channels,
642+
codec=audioStream.codec,
643+
language=audioStream.language
644+
))
673645

674646
for subtitleStream in part.subtitleStreams():
675-
item.addStreamInfo(
676-
'subtitle', {
677-
'language': subtitleStream.language
678-
}
679-
)
647+
videoInfoTag.addSubtitleStream(xbmc.SubtitleStreamDetail(
648+
language=subtitleStream.language
649+
))
680650

651+
path = None
681652
if mediaPart:
682653
# extract the absolute / actual path and the stream URL from the selected MediaPart
683-
info['path'] = mediaPart.file # path to file on disk
654+
path = mediaPart.file # path to file on disk
684655

685656
# determine if directPlay is enabled and possible
686657
if allowDirectPlay:
@@ -697,12 +668,12 @@ def fillVideoInfos(
697668
elif isFolder:
698669
# for folders use locations for the path
699670
if locations:
700-
info['path'] = locations[0]
671+
path = locations[0]
701672
item.setPath(plexServer.url(plexItem.key, includeToken=True))
702-
info['filenameandpath'] = item.getPath()
703673

704-
# set all the video infos
705-
item.setInfo('video', info)
674+
if path:
675+
videoInfoTag.setPath(path)
676+
videoInfoTag.setFilenameAndPath(item.getPath())
706677

707678
# handle artwork
708679
poster = None

0 commit comments

Comments
 (0)