@@ -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