docs: def fetch(self, cache=None):
          """Query the info page to fill in the property cache.
  
          Return a dictionary with the fetched properties and values.
  
          """
          self.reset()
          soup = get(self.url).soup
          details = soup.find(id="detailsframe")
          getdef = lambda s: [elem
                  for elem in details.find("dt",
                  text=re.compile(s)).next_siblings
                  if elem.name == 'dd'][0]
          getdefstring = lambda s: getdef(s).string.strip()
          info = {
              "title": details.find(id="title").string.strip(),
              "type": getdefstring("Type:"),
              "files": getdefstring("Files:"),
              "size": getdefstring("Size:"),
              "uploaded": getdefstring("Uploaded:"),
              "submitter": getdef("By:").parent.find("a", href=re.compile("user")).string.strip(),
              "seeders": getdefstring("Seeders:"),
              "leechers": getdefstring("Leechers:"),
              "comments": details.find(id="NumComments").string.strip(),
              "link": details.find("a", href=re.compile("^magnet\:"))['href'].strip(),
          }
          if self._use_cache(cache):
              self._attrs = info
          self._fetched = True
          return info