################################################################################################# # 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")) + " (" + item["Id"] + ").strm" else: filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S0E0 " + self.CleanName(item["Name"].decode('utf-8')) + " (" + item["Id"] + ").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")) + " (" + item["Id"] + ").nfo" else: filenamestr = self.CleanName(item.get("SeriesName")).encode('utf-8') + " S0E0 " + self.CleanName(item["Name"].decode('utf-8')) + " (" + item["Id"] + ").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(":", "-") name = name.replace("\\", "-") name = name.replace("/", "-") return name