From bde70f188169e35ad5a7d592a6a4a262e4a6f4c5 Mon Sep 17 00:00:00 2001 From: echel0n Date: Wed, 14 May 2014 02:42:08 -0700 Subject: [PATCH] Fixed metadata code to add proper indexer info to the tvshow.nfo files --- sickbeard/metadata/generic.py | 44 ++++++++++++++++++++++++++++++--- sickbeard/metadata/ps3.py | 3 +++ sickbeard/metadata/tivo.py | 3 +++ sickbeard/metadata/wdtv.py | 3 +++ sickbeard/show_queue.py | 4 ++- sickbeard/tv.py | 46 ++++++++++++++++++++++++++--------- 6 files changed, 86 insertions(+), 17 deletions(-) diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index c68fd6a1..636cfb89 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -260,19 +260,55 @@ class GenericMetadata(): """ return None - def create_show_metadata(self, show_obj, force=False): - if self.show_metadata and show_obj and (not self._has_show_metadata(show_obj) or force): + def create_show_metadata(self, show_obj): + if self.show_metadata and show_obj and not self._has_show_metadata(show_obj): logger.log(u"Metadata provider " + self.name + " creating show metadata for " + show_obj.name, logger.DEBUG) return self.write_show_file(show_obj) return False - def create_episode_metadata(self, ep_obj, force=False): - if self.episode_metadata and ep_obj and (not self._has_episode_metadata(ep_obj) or force): + def create_episode_metadata(self, ep_obj): + if self.episode_metadata and ep_obj and not self._has_episode_metadata(ep_obj): logger.log(u"Metadata provider " + self.name + " creating episode metadata for " + ep_obj.prettyName(), logger.DEBUG) return self.write_ep_file(ep_obj) return False + def update_show_indexer_metadata(self, show_obj): + if self.show_metadata and show_obj and self._has_show_metadata(show_obj): + logger.log(u"Metadata provider " + self.name + " updating show indexer info metadata file for " + show_obj.name, logger.DEBUG) + + nfo_file_path = self.get_show_file_path(show_obj) + try: + with ek.ek(open, nfo_file_path, 'r') as xmlFileObj: + showXML = etree.ElementTree(file=xmlFileObj) + + + indexer = showXML.find('indexer') + indexerid = showXML.find('id') + + root = showXML.getroot() + if indexer: + indexer.text = show_obj.indexer + else: + etree.SubElement(root, "indexer").text = str(show_obj.indexer) + + if indexerid: + indexerid.text = show_obj.indexerid + else: + etree.SubElement(root, "id").text = str(show_obj.indexerid) + + # Make it purdy + helpers.indentXML(root) + + showXML.write(nfo_file_path) + helpers.chmodAsParent(nfo_file_path) + + return True + except IOError, e: + logger.log( + u"Unable to write file to " + nfo_file_path + " - are you sure the folder is writable? " + ex(e), + logger.ERROR) + def create_fanart(self, show_obj): if self.fanart and show_obj and not self._has_fanart(show_obj): logger.log(u"Metadata provider " + self.name + " creating fanart for " + show_obj.name, logger.DEBUG) diff --git a/sickbeard/metadata/ps3.py b/sickbeard/metadata/ps3.py index 3aca3406..17a55c46 100644 --- a/sickbeard/metadata/ps3.py +++ b/sickbeard/metadata/ps3.py @@ -82,6 +82,9 @@ class PS3Metadata(generic.GenericMetadata): def create_show_metadata(self, show_obj, force=False): pass + def update_show_indexer_metadata(self, show_obj): + pass + def get_show_file_path(self, show_obj): pass diff --git a/sickbeard/metadata/tivo.py b/sickbeard/metadata/tivo.py index 06b88a0d..ec5c6a3b 100644 --- a/sickbeard/metadata/tivo.py +++ b/sickbeard/metadata/tivo.py @@ -90,6 +90,9 @@ class TIVOMetadata(generic.GenericMetadata): def create_show_metadata(self, show_obj, force=False): pass + def update_show_indexer_metadata(self, show_obj): + pass + def get_show_file_path(self, show_obj): pass diff --git a/sickbeard/metadata/wdtv.py b/sickbeard/metadata/wdtv.py index 00ad1a7f..b856e334 100644 --- a/sickbeard/metadata/wdtv.py +++ b/sickbeard/metadata/wdtv.py @@ -95,6 +95,9 @@ class WDTVMetadata(generic.GenericMetadata): def create_show_metadata(self, show_obj, force=False): pass + def update_show_indexer_metadata(self, show_obj): + pass + def get_show_file_path(self, show_obj): pass diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py index 437108ad..143b8f72 100644 --- a/sickbeard/show_queue.py +++ b/sickbeard/show_queue.py @@ -378,7 +378,8 @@ class QueueItemAdd(ShowQueueItem): logger.log(u"Launching backlog for this show since its episodes are WANTED") sickbeard.backlogSearchScheduler.action.searchBacklog([self.show]) #@UndefinedVariable - self.show.writeMetadata(force=True) + self.show.writeMetadata() + self.show.updateMetadata() self.show.populateCache() self.show.flushEpisodes() @@ -409,6 +410,7 @@ class QueueItemRefresh(ShowQueueItem): self.show.refreshDir() self.show.writeMetadata() + self.show.updateMetadata() self.show.populateCache() self.inProgress = False diff --git a/sickbeard/tv.py b/sickbeard/tv.py index fc0c0665..d436672d 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -253,7 +253,7 @@ class TVShow(object): return False - def writeShowNFO(self, force=False): + def writeShowNFO(self): result = False @@ -263,11 +263,11 @@ class TVShow(object): logger.log(str(self.indexerid) + u": Writing NFOs for show") for cur_provider in sickbeard.metadata_provider_dict.values(): - result = cur_provider.create_show_metadata(self, force) or result + result = cur_provider.create_show_metadata(self) or result return result - def writeMetadata(self, show_only=False, force=False): + def writeMetadata(self, show_only=False): if not ek.ek(os.path.isdir, self._location): logger.log(str(self.indexerid) + u": Show dir doesn't exist, skipping NFO generation") @@ -275,12 +275,12 @@ class TVShow(object): self.getImages() - self.writeShowNFO(force) + self.writeShowNFO() if not show_only: - self.writeEpisodeNFOs(force) + self.writeEpisodeNFOs() - def writeEpisodeNFOs(self, force=False): + def writeEpisodeNFOs(self): if not ek.ek(os.path.isdir, self._location): logger.log(str(self.indexerid) + u": Show dir doesn't exist, skipping NFO generation") @@ -295,9 +295,31 @@ class TVShow(object): logger.log(str(self.indexerid) + u": Retrieving/creating episode " + str(epResult["season"]) + "x" + str( epResult["episode"]), logger.DEBUG) curEp = self.getEpisode(epResult["season"], epResult["episode"]) - curEp.createMetaFiles(force) + curEp.createMetaFiles() + def updateMetadata(self): + + if not ek.ek(os.path.isdir, self._location): + logger.log(str(self.indexerid) + u": Show dir doesn't exist, skipping NFO generation") + return + + self.updateShowNFO() + + def updateShowNFO(self): + + result = False + + if not ek.ek(os.path.isdir, self._location): + logger.log(str(self.indexerid) + u": Show dir doesn't exist, skipping NFO generation") + return False + + logger.log(str(self.indexerid) + u": Updating NFOs for show with new indexer info") + for cur_provider in sickbeard.metadata_provider_dict.values(): + result = cur_provider.update_show_indexer_metadata(self) or result + + return result + # find all media files in the show folder and create episodes for as many as possible def loadEpisodesFromDir(self): @@ -1610,28 +1632,28 @@ class TVEpisode(object): toReturn += "status: " + str(self.status) + "\n" return toReturn - def createMetaFiles(self, force=False): + def createMetaFiles(self): if not ek.ek(os.path.isdir, self.show._location): logger.log(str(self.show.indexerid) + u": The show dir is missing, not bothering to try to create metadata") return - self.createNFO(force) + self.createNFO() self.createThumbnail() if self.checkForMetaFiles(): self.saveToDB() - def createNFO(self, force=False): + def createNFO(self): result = False for cur_provider in sickbeard.metadata_provider_dict.values(): - result = cur_provider.create_episode_metadata(self, force) or result + result = cur_provider.create_episode_metadata(self) or result return result - def createThumbnail(self, force=False): + def createThumbnail(self): result = False