docs: def listing(self, masked=True):
          """ List torrent info & contents. Returns a list of formatted lines.
          """
          # Assemble data
          metainfo, bad_encodings, bad_fields = sanitize(bencode.bread(self.filename), diagnostics=True)
          announce = metainfo['announce']
          info = metainfo['info']
          infohash = hashlib.sha1(bencode.bencode(info))
  
          total_size = data_size(metainfo)
          piece_length = info['piece length']
          piece_number, last_piece_length = divmod(total_size, piece_length)
  
          # Build result
          result = [
              "NAME %s" % (os.path.basename(fmt.to_unicode(self.filename))),
              "SIZE %s (%i * %s + %s)" % (
                  fmt.human_size(total_size).strip(),
                  piece_number, fmt.human_size(piece_length).strip(),
                  fmt.human_size(last_piece_length).strip(),
              ),
              "META %s (pieces %s %.1f%%)" % (
                  fmt.human_size(os.path.getsize(self.filename)).strip(),
                  fmt.human_size(len(info["pieces"])).strip(),
                  100.0 * len(info["pieces"]) / os.path.getsize(self.filename),
              ),
              "HASH %s" % (infohash.hexdigest().upper()),
              "URL  %s" % (mask_keys if masked else str)(announce),
              "PRV  %s" % ("YES (DHT/PEX disabled)" if info.get("private") else "NO (DHT/PEX enabled)"),
              "TIME %s" % ("N/A" if "creation date" not in metainfo else
                  time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(metainfo["creation date"]))
              ),
          ]
  
          for label, key in (("BY  ", "created by"), ("REM ", "comment")):
              if key in metainfo:
                  result.append("%s %s" % (label, metainfo.get(key, "N/A")))
  
          result.extend([
              "",
              "FILE LISTING%s" % ("" if 'length' in info else " [%d file(s)]" % len(info['files']),),
          ])
          if 'length' in info:
              # Single file
              result.append("%-69s%9s" % (
                      fmt.to_unicode(info['name']),
                      fmt.human_size(total_size),
              ))
          else:
              # Directory structure
              result.append("%s/" % fmt.to_unicode(info['name']))
              oldpaths = [None] * 99
              for entry in info['files']:
                  # Remove crap that certain PHP software puts in paths
                  entry_path = [fmt.to_unicode(i) for i in entry["path"] if i]
  
                  for idx, item in enumerate(entry_path[:-1]):
                      if item != oldpaths[idx]:
                          result.append("%s%s/" % (' ' * (4*(idx+1)), item))
                          oldpaths[idx] = item
                  result.append("%-69s%9s" % (
                      ' ' * (4*len(entry_path)) + entry_path[-1],
                      fmt.human_size(entry['length']),
                  ))
  
          if bad_encodings:
              result.extend([
                  "",
                  "WARNING: Bad encoding(s) {} in these fields: {}"
                  .format(', '.join(sorted(bad_encodings)), ', '.join(sorted(bad_fields))),
                  "Use the --raw option to inspect these encoding issues.",
              ])
  
          return result