docs: def GetShowDetails(self):
      """
      Extract show name, season number and episode number from file name.
  
      Supports formats S<NUM>E<NUM> or <NUM>x<NUM> for season and episode numbers
      where letters are case insensitive and number can be one or more digits. It
      expects season number to be unique however it can handle either single or
      multipart episodes (consecutive values only).
  
      All information preceeding season number is used for the show name lookup. This
      string is forced to lowercase and stripped of special characters
  
      Returns
      ----------
        boolean
          False if an incompatible file name is found, otherwise return True.
      """
  
      fileName = os.path.splitext(os.path.basename(self.fileInfo.origPath))[0]
  
      # Episode Number
      episodeNumSubstring = set(re.findall("(?<=[0-9])[xXeE][0-9]+(?:[xXeE_.-][0-9]+)*", fileName))
  
      if len(episodeNumSubstring) != 1:
        goodlogging.Log.Info("TVFILE", "Incompatible filename no episode match detected: {0}".format(self.fileInfo.origPath))
        return False
  
      episodeNumSet = set(re.findall("(?<=[xXeE_.-])[0-9]+", episodeNumSubstring.pop()))
  
      episodeNumList = [int(i) for i in episodeNumSet]
      episodeNumList.sort()
  
      episodeNum = "{0}".format(episodeNumList[0])
      if len(episodeNumList) > 1:
        episodeNumReference = episodeNumList[0]
        for episodeNumIter in episodeNumList[1:]:
          if episodeNumIter == (episodeNumReference+1):
            strNum = "{0}".format(episodeNumIter)
            if len(strNum) == 1:
              strNum = "0{0}".format(strNum)
  
            self.showInfo.multiPartEpisodeNumbers.append(strNum)
            episodeNumReference = episodeNumIter
          else:
            break
  
      if len(episodeNum) == 1:
        episodeNum = "0{0}".format(episodeNum)
  
      self.showInfo.episodeNum = episodeNum
  
      # Season Number
      seasonNumSet = set(re.findall("[sS]([0-9]+)", fileName))
      preceedingS = True
  
      if len(seasonNumSet) == 1:
        seasonNum = seasonNumSet.pop()
      else:
        seasonNumSet = set(re.findall("([0-9]+)[xX](?:[0-9]+[xX])*", fileName))
        preceedingS = False
  
        if len(seasonNumSet) == 1:
          seasonNum = seasonNumSet.pop()
        else:
          goodlogging.Log.Info("TVFILE", "Incompatible filename no season match detected: {0}".format(self.fileInfo.origPath))
          return False
  
      if len(seasonNum) == 1:
        seasonNum = "0{0}".format(seasonNum)
  
      self.showInfo.seasonNum = seasonNum
  
      # Show Name
      if preceedingS is True:
        showNameList = re.findall("(.+?)\s*[_.-]*\s*[sS][0-9]+[xXeE][0-9]+.*", fileName)
      else:
        showNameList = re.findall("(.+?)\s*[_.-]*\s*[0-9]+[xXeE][0-9]+.*", fileName)
  
      if len(showNameList) == 1:
        showName = util.StripSpecialCharacters(showNameList[0].lower(), stripAll=True)
      else:
        goodlogging.Log.Info("TVFILE", "Incompatible filename no show name detected: {0}".format(self.fileInfo.origPath))
        return False
  
      self.fileInfo.showName = showName
      return True