def full_lookup(self, path): if self.media_id is not None: log.debug("Have IMDB ID, no further lookup necessary for {!r}", self) return complete(self) path = pathlib.Path(path) nfo = path.with_suffix('.nfo') log.debug("Attempting NFO read {!r}", nfo) try: e = lxml.etree.fromstring(nfo.open('rb').read()) except lxml.etree.XMLSyntaxError as e: log.warning("Error reading XML for {!r} {}", nfo, e) return convoluted_imdb_lookup(self) except FileNotFoundError: log.debug("No nfo found, doing lookup") return convoluted_imdb_lookup(self) else: def attr(a): try: return e.xpath('./{}'.format(a))[0].text except IndexError: return None title = attr('title') year = attr('year') media_id = attr('id') genres = e.xpath('./genre/text()') new = {} if title: new['title'] = title if year: new['year'] = int(year) if media_id: new['media_id'] = media_id if genres: new['genres'] = genres if any([title is None, year is None, media_id is None, not genres]): # we'll do the IMDB lookup, but try and fill out with any # information we did have return convoluted_imdb_lookup(self._replace(**new)) return complete(self._replace(**new))
def from_path(cls, path): path = pathlib.Path(path) self = cls(media_id=None, title=None, season=None, episode=None, year=None, genres=[]).scan_fs(path) lookups = self.guessit(path) if not lookups[0].complete: n = [l.full_lookup(str(path)) for l in lookups] else: n = [complete(l) for l in lookups] return n