@@ -595,28 +595,36 @@ def _label_name_to_id(self, label_name: str) -> str:
595595 if label_name in self ._label_cache :
596596 return self ._label_cache [label_name ]
597597
598- if self ._service is not None :
599- service = self ._build_service ()
600- created = self ._execute_legacy (
601- service .users ().labels ().create (
602- userId = self .user_id ,
603- body = {
598+ try :
599+ if self ._service is not None :
600+ service = self ._build_service ()
601+ created = self ._execute_legacy (
602+ service .users ().labels ().create (
603+ userId = self .user_id ,
604+ body = {
605+ "name" : label_name ,
606+ "messageListVisibility" : "show" ,
607+ "labelListVisibility" : "labelShow" ,
608+ },
609+ )
610+ )
611+ else :
612+ created = self ._request_json (
613+ "POST" ,
614+ "labels" ,
615+ json_body = {
604616 "name" : label_name ,
605617 "messageListVisibility" : "show" ,
606618 "labelListVisibility" : "labelShow" ,
607619 },
608620 )
609- )
610- else :
611- created = self ._request_json (
612- "POST" ,
613- "labels" ,
614- json_body = {
615- "name" : label_name ,
616- "messageListVisibility" : "show" ,
617- "labelListVisibility" : "labelShow" ,
618- },
619- )
621+ except Exception as exc :
622+ if self ._is_label_conflict_error (exc ):
623+ self ._refresh_label_cache ()
624+ existing_id = self ._label_cache .get (label_name )
625+ if existing_id :
626+ return existing_id
627+ raise
620628 self ._label_cache [label_name ] = created ["id" ]
621629 return created ["id" ]
622630
@@ -655,6 +663,17 @@ def _is_missing_label_error(exc: Exception) -> bool:
655663 return True
656664 return "404" in str (exc )
657665
666+ @staticmethod
667+ def _is_label_conflict_error (exc : Exception ) -> bool :
668+ status_code = getattr (getattr (exc , "response" , None ), "status_code" , None )
669+ if status_code == 409 :
670+ return True
671+ legacy_status = getattr (getattr (exc , "resp" , None ), "status" , None )
672+ if legacy_status == 409 :
673+ return True
674+ lowered = str (exc ).lower ()
675+ return "409" in lowered
676+
658677 def apply_labels (self , email_ids : list [str ], labels : list [str ]) -> None :
659678 if not labels :
660679 return
0 commit comments