diff --git a/resources/lib/CreateFiles.py b/resources/lib/CreateFiles.py new file mode 100644 index 00000000..8acbfd66 --- /dev/null +++ b/resources/lib/CreateFiles.py @@ -0,0 +1,215 @@ +################################################################################################# +# CreateFiles +################################################################################################# + +import xbmc +import xbmcgui +import xbmcaddon +import xbmcvfs +import os +import json + +from xml.etree.ElementTree import Element, SubElement, Comment, tostring +from xml.etree import ElementTree +from xml.dom import minidom +import xml.etree.cElementTree as ET + +from DownloadUtils import DownloadUtils +from API import API +import Utils as utils + +addon = xbmcaddon.Addon(id='plugin.video.mb3sync') +addondir = xbmc.translatePath(addon.getAddonInfo('profile')) +dataPath = os.path.join(addondir,"library") +movieLibrary = os.path.join(dataPath,'movies') +tvLibrary = os.path.join(dataPath,'tvshows') + +class CreateFiles(): + def createSTRM(self,item,parentId=None): + + item_type=str(item.get("Type")).encode('utf-8') + if item_type == "Movie": + itemPath = os.path.join(movieLibrary,item["Id"]) + strmFile = os.path.join(itemPath,item["Id"] + ".strm") + + if item_type == "MusicVideo": + itemPath = os.path.join(musicVideoLibrary,item["Id"]) + strmFile = os.path.join(itemPath,item["Id"] + ".strm") + + if item_type == "Episode": + itemPath = os.path.join(tvLibrary,parentId) + if str(item.get("IndexNumber")) != None: + filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S" + str(item.get("ParentIndexNumber")) + "E" + str(item.get("IndexNumber")) + ".strm" + else: + filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S0E0 " + item["Name"].decode('utf-8') + ".strm" + strmFile = os.path.join(itemPath,filenamestr) + + changes = False + if not xbmcvfs.exists(strmFile): + changes = True + xbmcvfs.mkdir(itemPath) + text_file = open(strmFile, "w") + + playUrl = "plugin://plugin.video.mb3sync/?id=" + item["Id"] + '&mode=play' + + text_file.writelines(playUrl) + text_file.close() + + return changes + + def createNFO(self,item, parentId=None): + downloadUtils = DownloadUtils() + timeInfo = API().getTimeInfo(item) + userData=API().getUserData(item) + people = API().getPeople(item) + mediaStreams=API().getMediaStreams(item) + studios = API().getStudios(item) + userid = downloadUtils.getUserId() + port = addon.getSetting('port') + host = addon.getSetting('ipaddress') + server = host + ":" + port + item_type=str(item.get("Type")) + + if item_type == "Movie": + itemPath = os.path.join(movieLibrary,item["Id"]) + nfoFile = os.path.join(itemPath,item["Id"] + ".nfo") + rootelement = "movie" + if item_type == "Series": + itemPath = os.path.join(tvLibrary,item["Id"]) + nfoFile = os.path.join(itemPath,"tvshow.nfo") + rootelement = "tvshow" + if item_type == "Episode": + itemPath = os.path.join(tvLibrary,parentId) + if str(item.get("ParentIndexNumber")) != None: + filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S" + str(item.get("ParentIndexNumber")) + "E" + str(item.get("IndexNumber")) + ".nfo" + else: + filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S0E0 " + item["Name"].decode('utf-8') + ".nfo" + nfoFile = os.path.join(itemPath,filenamestr) + rootelement = "episodedetails" + + changes = False + if not xbmcvfs.exists(nfoFile): + changes = True + utils.logMsg("MB3 Syncer","creating NFO file " + nfoFile) + xbmcvfs.mkdir(itemPath) + root = Element(rootelement) + SubElement(root, "id").text = item["Id"] + if item.get("Tag") != None: + for tag in item.get("Tag"): + SubElement(root, "tag").text = tag + + SubElement(root, "thumb").text = API().getArtwork(item, "Primary") + SubElement(root, "fanart").text = API().getArtwork(item, "Backdrop") + SubElement(root, "title").text = utils.convertEncoding(item["Name"]) + SubElement(root, "originaltitle").text = utils.convertEncoding(item["Name"]) + SubElement(root, "sorttitle").text = utils.convertEncoding(item["SortName"]) + + if item.has_key("OfficialRating"): + SubElement(root, "mpaa").text = item["OfficialRating"] + + if item.get("CriticRating") != None: + rating = int(item.get("CriticRating"))/10 + SubElement(root, "rating").text = str(rating) + + if item.get("DateCreated") != None: + SubElement(root, "dateadded").text = item["DateCreated"] + + if userData.get("PlayCount") != None: + SubElement(root, "playcount").text = userData.get("PlayCount") + if int(userData.get("PlayCount")) > 0: + SubElement(root, "watched").text = "true" + + if timeInfo.get("ResumeTime") != None: + resume_sec = int(round(float(timeInfo.get("ResumeTime"))))*60 + total_sec = int(round(float(timeInfo.get("TotalTime"))))*60 + resume = SubElement(root, "resume") + SubElement(resume, "position").text = str(resume_sec) + SubElement(resume, "total").text = str(total_sec) + + if item_type == "Episode": + SubElement(root, "season").text = str(item.get("ParentIndexNumber")) + SubElement(root, "episode").text = str(item.get("IndexNumber")) + SubElement(root, "aired").text = str(item.get("ProductionYear")) + + SubElement(root, "year").text = str(item.get("ProductionYear")) + if item.get("PremiereDate") != None: + premieredatelist = (item.get("PremiereDate")).split("T") + premieredate = premieredatelist[0] + SubElement(root, "firstaired").text = premieredate + SubElement(root, "premieredate").text = premieredate + + if(timeInfo.get('Duration') != "0"): + SubElement(root, "runtime").text = str(timeInfo.get('Duration')) + + SubElement(root, "plot").text = utils.convertEncoding(API().getOverview(item)) + + if item.get("ShortOverview") != None: + SubElement(root, "plotoutline").text = utils.convertEncoding(item.get("ShortOverview")) + + if item.get("TmdbCollectionName") != None: + SubElement(root, "set").text = item.get("TmdbCollectionName") + + if item.get("ProviderIds") != None: + if item.get("ProviderIds").get("Imdb") != None: + SubElement(root, "imdbnumber").text = item + + if people.get("Writer") != None: + for writer in people.get("Writer"): + SubElement(root, "writer").text = utils.convertEncoding(writer) + + if people.get("Director") != None: + for director in people.get("Director"): + SubElement(root, "director").text = utils.convertEncoding(director) + + if item.get("Genres") != None: + for genre in item.get("Genres"): + SubElement(root, "genre").text = utils.convertEncoding(genre) + + if studios != None: + for studio in studios: + SubElement(root, "studio").text = utils.convertEncoding(studio) + + if item.get("ProductionLocations") != None: + for country in item.get("ProductionLocations"): + SubElement(root, "country").text = utils.convertEncoding(country) + + #trailer link + trailerUrl = None + if item.get("LocalTrailerCount") != None and item.get("LocalTrailerCount") > 0: + itemTrailerUrl = "http://" + server + "/mediabrowser/Users/" + userid + "/Items/" + item.get("Id") + "/LocalTrailers?format=json" + jsonData = downloadUtils.downloadUrl(itemTrailerUrl, suppress=True, popup=0 ) + if(jsonData != ""): + trailerItem = json.loads(jsonData) + trailerUrl = "plugin://plugin.video.mb3sync/?id=" + trailerItem[0].get("Id") + '&mode=play' + SubElement(root, "trailer").text = trailerUrl + + #add streamdetails + fileinfo = SubElement(root, "fileinfo") + streamdetails = SubElement(fileinfo, "streamdetails") + video = SubElement(streamdetails, "video") + SubElement(video, "duration").text = str(mediaStreams.get('totaltime')) + SubElement(video, "aspect").text = mediaStreams.get('aspectratio') + SubElement(video, "codec").text = mediaStreams.get('videocodec') + SubElement(video, "width").text = str(mediaStreams.get('width')) + SubElement(video, "height").text = str(mediaStreams.get('height')) + SubElement(video, "duration").text = str(timeInfo.get('Duration')) + + audio = SubElement(streamdetails, "audio") + SubElement(audio, "codec").text = mediaStreams.get('audiocodec') + SubElement(audio, "channels").text = mediaStreams.get('channels') + + #add people + if item.get("People") != None: + for actor in item.get("People"): + if(actor.get("Type") == "Actor"): + actor_elem = SubElement(root, "actor") + SubElement(actor_elem, "name").text = utils.convertEncoding(actor.get("Name")) + SubElement(actor_elem, "type").text = utils.convertEncoding(actor.get("Role")) + SubElement(actor_elem, "thumb").text = downloadUtils.imageUrl(actor.get("Id"), "Primary", 0, 400, 400) + + ET.ElementTree(root).write(nfoFile, xml_declaration=True) + return changes + + def CleanName(self, name): + name = name.replace(":", "-") + return name diff --git a/resources/lib/LibrarySync.py b/resources/lib/LibrarySync.py index ed97e1f7..14429a40 100644 --- a/resources/lib/LibrarySync.py +++ b/resources/lib/LibrarySync.py @@ -15,15 +15,11 @@ from datetime import datetime, timedelta, time import urllib2 import os -from xml.etree.ElementTree import Element, SubElement, Comment, tostring -from xml.etree import ElementTree -from xml.dom import minidom -import xml.etree.cElementTree as ET - from API import API import Utils as utils from DownloadUtils import DownloadUtils from ReadEmbyDB import ReadEmbyDB +from CreateFiles import CreateFiles addon = xbmcaddon.Addon(id='plugin.video.mb3sync') addondir = xbmc.translatePath(addon.getAddonInfo('profile')) @@ -447,8 +443,8 @@ class LibrarySync(): #add actors self.AddActorsToMedia(KodiItem,MBitem.get("People"),"movie") - self.createSTRM(MBitem) - self.createNFO(MBitem) + CreateFiles().createSTRM(MBitem) + CreateFiles().createNFO(MBitem) if changes: utils.logMsg("Updated item to Kodi Library", MBitem["Id"] + " - " + MBitem["Name"]) @@ -508,7 +504,7 @@ class LibrarySync(): #add actors changes = self.AddActorsToMedia(KodiItem,MBitem.get("People"),"tvshow") - self.createNFO(MBitem) + CreateFiles().createNFO(MBitem) if changes: utils.logMsg("Updated item to Kodi Library", MBitem["Id"] + " - " + MBitem["Name"]) @@ -566,8 +562,8 @@ class LibrarySync(): #add actors changes = self.AddActorsToMedia(KodiItem,MBitem.get("People"),"episode") - self.createNFO(MBitem, tvshowId) - self.createSTRM(MBitem, tvshowId) + CreateFiles().createNFO(MBitem, tvshowId) + CreateFiles().createSTRM(MBitem, tvshowId) if changes: utils.logMsg("Updated item to Kodi Library", MBitem["Id"] + " - " + MBitem["Name"]) @@ -671,195 +667,6 @@ class LibrarySync(): return pendingChanges - def CleanName(self, name): - name = name.replace(":", "-") - return name - - def createSTRM(self,item,parentId=None): - - item_type=str(item.get("Type")).encode('utf-8') - if item_type == "Movie": - itemPath = os.path.join(movieLibrary,item["Id"]) - strmFile = os.path.join(itemPath,item["Id"] + ".strm") - - if item_type == "MusicVideo": - itemPath = os.path.join(musicVideoLibrary,item["Id"]) - strmFile = os.path.join(itemPath,item["Id"] + ".strm") - - if item_type == "Episode": - itemPath = os.path.join(tvLibrary,parentId) - if str(item.get("IndexNumber")) != None: - filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S" + str(item.get("ParentIndexNumber")) + "E" + str(item.get("IndexNumber")) + ".strm" - else: - filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S0E0 " + item["Name"].decode('utf-8') + ".strm" - strmFile = os.path.join(itemPath,filenamestr) - - changes = False - if not xbmcvfs.exists(strmFile): - changes = True - xbmcvfs.mkdir(itemPath) - text_file = open(strmFile, "w") - - playUrl = "plugin://plugin.video.mb3sync/?id=" + item["Id"] + '&mode=play' - - text_file.writelines(playUrl) - text_file.close() - - return changes - - def createNFO(self,item, parentId=None): - downloadUtils = DownloadUtils() - timeInfo = API().getTimeInfo(item) - userData=API().getUserData(item) - people = API().getPeople(item) - mediaStreams=API().getMediaStreams(item) - studios = API().getStudios(item) - userid = downloadUtils.getUserId() - port = addon.getSetting('port') - host = addon.getSetting('ipaddress') - server = host + ":" + port - item_type=str(item.get("Type")) - - if item_type == "Movie": - itemPath = os.path.join(movieLibrary,item["Id"]) - nfoFile = os.path.join(itemPath,item["Id"] + ".nfo") - rootelement = "movie" - if item_type == "Series": - itemPath = os.path.join(tvLibrary,item["Id"]) - nfoFile = os.path.join(itemPath,"tvshow.nfo") - rootelement = "tvshow" - if item_type == "Episode": - itemPath = os.path.join(tvLibrary,parentId) - if str(item.get("ParentIndexNumber")) != None: - filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S" + str(item.get("ParentIndexNumber")) + "E" + str(item.get("IndexNumber")) + ".nfo" - else: - filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S0E0 " + item["Name"].decode('utf-8') + ".nfo" - nfoFile = os.path.join(itemPath,filenamestr) - rootelement = "episodedetails" - - changes = False - if not xbmcvfs.exists(nfoFile): - changes = True - utils.logMsg("MB3 Syncer","creating NFO file " + nfoFile) - xbmcvfs.mkdir(itemPath) - root = Element(rootelement) - SubElement(root, "id").text = item["Id"] - if item.get("Tag") != None: - for tag in item.get("Tag"): - SubElement(root, "tag").text = tag - - SubElement(root, "thumb").text = API().getArtwork(item, "Primary") - SubElement(root, "fanart").text = API().getArtwork(item, "Backdrop") - SubElement(root, "title").text = utils.convertEncoding(item["Name"]) - SubElement(root, "originaltitle").text = utils.convertEncoding(item["Name"]) - SubElement(root, "sorttitle").text = utils.convertEncoding(item["SortName"]) - - if item.has_key("OfficialRating"): - SubElement(root, "mpaa").text = item["OfficialRating"] - - if item.get("CriticRating") != None: - rating = int(item.get("CriticRating"))/10 - SubElement(root, "rating").text = str(rating) - - if item.get("DateCreated") != None: - SubElement(root, "dateadded").text = item["DateCreated"] - - if userData.get("PlayCount") != None: - SubElement(root, "playcount").text = userData.get("PlayCount") - if int(userData.get("PlayCount")) > 0: - SubElement(root, "watched").text = "true" - - if timeInfo.get("ResumeTime") != None: - resume_sec = int(round(float(timeInfo.get("ResumeTime"))))*60 - total_sec = int(round(float(timeInfo.get("TotalTime"))))*60 - resume = SubElement(root, "resume") - SubElement(resume, "position").text = str(resume_sec) - SubElement(resume, "total").text = str(total_sec) - - if item_type == "Episode": - SubElement(root, "season").text = str(item.get("ParentIndexNumber")) - SubElement(root, "episode").text = str(item.get("IndexNumber")) - SubElement(root, "aired").text = str(item.get("ProductionYear")) - - SubElement(root, "year").text = str(item.get("ProductionYear")) - if item.get("PremiereDate") != None: - premieredatelist = (item.get("PremiereDate")).split("T") - premieredate = premieredatelist[0] - SubElement(root, "firstaired").text = premieredate - SubElement(root, "premieredate").text = premieredate - - if(timeInfo.get('Duration') != "0"): - SubElement(root, "runtime").text = str(timeInfo.get('Duration')) - - SubElement(root, "plot").text = utils.convertEncoding(API().getOverview(item)) - - if item.get("ShortOverview") != None: - SubElement(root, "plotoutline").text = utils.convertEncoding(item.get("ShortOverview")) - - if item.get("TmdbCollectionName") != None: - SubElement(root, "set").text = item.get("TmdbCollectionName") - - if item.get("ProviderIds") != None: - if item.get("ProviderIds").get("Imdb") != None: - SubElement(root, "imdbnumber").text = item - - if people.get("Writer") != None: - for writer in people.get("Writer"): - SubElement(root, "writer").text = utils.convertEncoding(writer) - - if people.get("Director") != None: - for director in people.get("Director"): - SubElement(root, "director").text = utils.convertEncoding(director) - - if item.get("Genres") != None: - for genre in item.get("Genres"): - SubElement(root, "genre").text = utils.convertEncoding(genre) - - if studios != None: - for studio in studios: - SubElement(root, "studio").text = utils.convertEncoding(studio) - - if item.get("ProductionLocations") != None: - for country in item.get("ProductionLocations"): - SubElement(root, "country").text = utils.convertEncoding(country) - - #trailer link - trailerUrl = None - if item.get("LocalTrailerCount") != None and item.get("LocalTrailerCount") > 0: - itemTrailerUrl = "http://" + server + "/mediabrowser/Users/" + userid + "/Items/" + item.get("Id") + "/LocalTrailers?format=json" - jsonData = downloadUtils.downloadUrl(itemTrailerUrl, suppress=True, popup=0 ) - if(jsonData != ""): - trailerItem = json.loads(jsonData) - trailerUrl = "plugin://plugin.video.mb3sync/?id=" + trailerItem[0].get("Id") + '&mode=play' - SubElement(root, "trailer").text = trailerUrl - - #add streamdetails - fileinfo = SubElement(root, "fileinfo") - streamdetails = SubElement(fileinfo, "streamdetails") - video = SubElement(streamdetails, "video") - SubElement(video, "duration").text = str(mediaStreams.get('totaltime')) - SubElement(video, "aspect").text = mediaStreams.get('aspectratio') - SubElement(video, "codec").text = mediaStreams.get('videocodec') - SubElement(video, "width").text = str(mediaStreams.get('width')) - SubElement(video, "height").text = str(mediaStreams.get('height')) - SubElement(video, "duration").text = str(timeInfo.get('Duration')) - - audio = SubElement(streamdetails, "audio") - SubElement(audio, "codec").text = mediaStreams.get('audiocodec') - SubElement(audio, "channels").text = mediaStreams.get('channels') - - #add people - if item.get("People") != None: - for actor in item.get("People"): - if(actor.get("Type") == "Actor"): - actor_elem = SubElement(root, "actor") - SubElement(actor_elem, "name").text = utils.convertEncoding(actor.get("Name")) - SubElement(actor_elem, "type").text = utils.convertEncoding(actor.get("Role")) - SubElement(actor_elem, "thumb").text = downloadUtils.imageUrl(actor.get("Id"), "Primary", 0, 400, 400) - - ET.ElementTree(root).write(nfoFile, xml_declaration=True) - return changes - def addMovieToKodiLibrary( self, item ): itemPath = os.path.join(movieLibrary,item["Id"]) strmFile = os.path.join(itemPath,item["Id"] + ".strm") @@ -871,10 +678,10 @@ class LibrarySync(): xbmcvfs.mkdir(itemPath) #create nfo file - changes = self.createNFO(item) + changes = CreateFiles().createNFO(item) # create strm file - changes = self.createSTRM(item) + changes = CreateFiles().createSTRM(item) if changes: utils.logMsg("MB3 Sync","Added movie to Kodi Library",item["Id"] + " - " + item["Name"]) @@ -884,10 +691,10 @@ class LibrarySync(): changes = False #create nfo file - changes = self.createNFO(item, tvshowId) + changes = CreateFiles().createNFO(item, tvshowId) # create strm file - changes = self.createSTRM(item, tvshowId) + changes = CreateFiles().createSTRM(item, tvshowId) if changes: utils.logMsg("MB3 Sync","Added episode to Kodi Library",item["Id"] + " - " + item["Name"]) @@ -911,7 +718,7 @@ class LibrarySync(): xbmcvfs.mkdir(itemPath) #create nfo file - changes = self.createNFO(item) + changes = CreateFiles().createNFO(item) if changes: utils.logMsg("Added TV Show to Kodi Library ",item["Id"] + " - " + item["Name"])