# -*- coding: utf-8 -*-fromtypingimportFinal,List,Optional,TupleTYPE_SEPARATOR:Final[str]="/"PARAMETER_SEPARATOR:Final[str]=";"PARAM_SEP:Final[str]=PARAMETER_SEPARATORANY_WILDCARD:Final[str]="*"classMimeType:""" A media type (formerly known as MIME type) is a two-part identifier for file formats and format contents transmitted on the Internet. See also: * https://en.wikipedia.org/wiki/Media_type * https://datatracker.ietf.org/doc/html/rfc2045#section-5.1 * https://www.iana.org/assignments/media-types/media-types.xhtml """def__init__(self,family:str,subtype:str,parameter:Optional[str]=None,original:Optional[str]=None,name:Optional[str]=None,reference:Optional[str]=None,):# The `type` of MIME is a Python reserved character.# Therefore, the name will be changed to `family`.self.family=family.strip().lower()# Does not parse `tree` and `suffix`.self.subtype=subtype.strip().lower()# Does not parse `attribute` and `value`.self.parameter=parameter# Full original text.self.original=originalself.name=nameself.reference=reference@propertydefmime(self)->str:prefix=f"{self.family}{TYPE_SEPARATOR}{self.subtype}"ifself.parameter:returnf"{prefix}{PARAM_SEP}{self.parameter}"else:returnprefix@propertydefparameter_tuple(self)->Tuple[Optional[str],Optional[str]]:ifnotself.parameter:returnNone,Nonekv=self.parameter.split("=",1)key=kv[0].strip()iflen(kv)==1:returnkey,Noneassertlen(kv)==2returnkey,kv[1].strip()defget_parameter_value(self,key:str,default_value:Optional[str]=None,lower_key=True,)->Optional[str]:pkey,pval=self.parameter_tupleifpkeyisNoneorpvalisNone:returndefault_valuepkey=pkey.lower()iflower_keyelsepkeyifpkey!=key:returndefault_valuereturnpval@propertydefcharset(self)->Optional[str]:returnself.get_parameter_value("charset",lower_key=True)@propertydefq(self)->Optional[float]:val=self.get_parameter_value("q",lower_key=True)ifvalisNone:returnNonetry:returnfloat(val)exceptValueError:returnNone@classmethoddefparse(cls,text:str,name:Optional[str]=None,reference:Optional[str]=None,)->"MimeType":types_and_param=text.split(PARAM_SEP,1)assert1<=len(types_and_param)<=2parameter:Optional[str]=Noneiflen(types_and_param)==2:parameter=types_and_param[1].strip()types=types_and_param[0].strip().split(TYPE_SEPARATOR,1)assert1<=len(types)<=2family=types[0]iflen(types)==1:iffamily==ANY_WILDCARD:subtype=ANY_WILDCARDelse:subtype=str()else:assertlen(types)==2subtype=types[1]returncls(family,subtype,parameter,text,name,reference)def__str__(self)->str:returnself.mimedeftest_from_accept(self,accept:"MimeType")->bool:ifself.family==accept.family:passelifaccept.family==ANY_WILDCARD:passelifself.family==ANY_WILDCARD:passelse:assertself.family!=accept.familyreturnFalseifself.subtype==accept.subtype:returnTrueelifaccept.subtype==ANY_WILDCARD:returnTrueelifself.subtype==ANY_WILDCARD:returnTrueelse:assertself.subtype!=accept.subtypereturnFalsedeftest_from_accepts(self,accepts:List["MimeType"])->bool:foracceptinaccepts:ifself.test_from_accept(accept):returnTruereturnFalseSINGLE_ANY:Final[str]="*"BOTH_ANY:Final[str]="*/*"APPLICATION_OCTET_STREAM:Final[str]="application/octet-stream"APPLICATION_JSON:Final[str]="application/json"APPLICATION_XML:Final[str]="application/xml"APPLICATION_YAML:Final[str]="application/x-yaml"APPLICATION_FORM:Final[str]="application/x-www-form-urlencoded"TEXT_PLAIN:Final[str]="text/plain"CHARSET_UTF8:Final[str]="charset=utf-8"MIME_ANY=MimeType.parse(SINGLE_ANY)MIME_ANY_BOTH=MimeType.parse(BOTH_ANY)MIME_APPLICATION_OCTET_STREAM=MimeType.parse(APPLICATION_OCTET_STREAM)MIME_APPLICATION_JSON=MimeType.parse(APPLICATION_JSON)MIME_APPLICATION_XML=MimeType.parse(APPLICATION_XML)MIME_APPLICATION_YAML=MimeType.parse(APPLICATION_YAML)MIME_APPLICATION_FORM=MimeType.parse(APPLICATION_FORM)MIME_TEXT_PLAIN=MimeType.parse(TEXT_PLAIN)MIME_APPLICATION_JSON_UTF8=MimeType.parse(APPLICATION_JSON+PARAM_SEP+CHARSET_UTF8)MIME_APPLICATION_XML_UTF8=MimeType.parse(APPLICATION_XML+PARAM_SEP+CHARSET_UTF8)MIME_APPLICATION_YAML_UTF8=MimeType.parse(APPLICATION_YAML+PARAM_SEP+CHARSET_UTF8)MIME_APPLICATION_FORM_UTF8=MimeType.parse(APPLICATION_FORM+PARAM_SEP+CHARSET_UTF8)MIME_TEXT_PLAIN_UTF8=MimeType.parse(TEXT_PLAIN+PARAM_SEP+CHARSET_UTF8)