code: def clean_filename(s, minimal_change=False):
      
  
      # First, deal with URL encoded strings
      h = html_parser.HTMLParser()
      s = h.unescape(s)
      s = unquote_plus(s)
  
      # Strip forbidden characters
      # https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
      s = (
          s.replace(':', '-')
          .replace('/', '-')
          .replace('<', '-')
          .replace('>', '-')
          .replace('"', '-')
          .replace('\\', '-')
          .replace('|', '-')
          .replace('?', '-')
          .replace('*', '-')
          .replace('\x00', '-')
          .replace('\n', ' ')
      )
  
      # Remove trailing dots and spaces; forbidden on Windows
      s = s.rstrip(' .')
  
      if minimal_change:
          return s
  
      s = s.replace('(', '').replace(')', '')
      s = s.rstrip('.')  # Remove excess of trailing dots
  
      s = s.strip().replace(' ', '_')
      valid_chars = '-_.()%s%s' % (string.ascii_letters, string.digits)
      return ''.join(c for c in s if c in valid_chars)
docs: Sanitize a string to be used as a filename.
  
      If minimal_change is set to true, then we only strip the bare minimum of
      characters that are problematic for filesystems (namely, ':', '/' and
      '\x00', '\n').