Skip to content

Commit 54d2678

Browse files
committed
fix pledge box; add generic parser; fix KeyError: tracking_number
1 parent 8f27773 commit 54d2678

File tree

4 files changed

+52
-5
lines changed

4 files changed

+52
-5
lines changed

custom_components/email/const.py

+6
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@
1616
EMAIL_ATTR_FROM = 'from'
1717
EMAIL_ATTR_SUBJECT = 'subject'
1818
EMAIL_ATTR_BODY = 'body'
19+
20+
USPS_TRACKING_NUMBER_REGEX = r"\b(94\d{20}|\d{4}\s\d{4}\s\d{4}\s\d{4}\s\d{4}\s\d{2})\b"
21+
UPS_TRACKING_NUMBER_REGEX = r"\b(1Z[A-HJ-NP-Z0-9]{16})\b"
22+
FEDEX_TRACKING_NUMBER_REGEX = r"\b(\d{12})\b"
23+
24+
EMAIL_DOMAIN_REGEX = r"@([\w.-]+)"
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import logging
2+
import re
3+
4+
from bs4 import BeautifulSoup
5+
from ..const import EMAIL_ATTR_BODY, USPS_TRACKING_NUMBER_REGEX, UPS_TRACKING_NUMBER_REGEX, FEDEX_TRACKING_NUMBER_REGEX
6+
7+
_LOGGER = logging.getLogger(__name__)
8+
ATTR_GENERIC = 'generic'
9+
EMAIL_DOMAIN_GENERIC = ''
10+
11+
def parse_generic(email):
12+
"""Tries to parse tracking numbers for any type of email."""
13+
tracking_numbers = []
14+
15+
soup = BeautifulSoup(email[EMAIL_ATTR_BODY], 'html.parser')
16+
17+
matches = re.findall(UPS_TRACKING_NUMBER_REGEX, email[EMAIL_ATTR_BODY])
18+
for tracking_number in matches:
19+
if tracking_number not in tracking_numbers:
20+
tracking_numbers.append(tracking_number)
21+
22+
matches = re.findall(USPS_TRACKING_NUMBER_REGEX, email[EMAIL_ATTR_BODY])
23+
for tracking_number in matches:
24+
if tracking_number not in tracking_numbers:
25+
tracking_numbers.append(tracking_number)
26+
27+
matches = re.findall(FEDEX_TRACKING_NUMBER_REGEX, email[EMAIL_ATTR_BODY])
28+
for tracking_number in matches:
29+
if tracking_number not in tracking_numbers:
30+
tracking_numbers.append(tracking_number)
31+
32+
return tracking_numbers,

custom_components/email/parsers/pledgebox.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import re
33

44
from bs4 import BeautifulSoup
5-
from ..const import EMAIL_ATTR_BODY
5+
from ..const import EMAIL_ATTR_BODY, USPS_TRACKING_NUMBER_REGEX
66

77

88
_LOGGER = logging.getLogger(__name__)
@@ -24,4 +24,9 @@ def parse_pledgebox(email):
2424
if match and match.group(1) not in tracking_numbers:
2525
tracking_numbers.append(match.group(1))
2626

27+
matches = re.findall(USPS_TRACKING_NUMBER_REGEX, email[EMAIL_ATTR_BODY])
28+
for tracking_number in matches:
29+
if tracking_number not in tracking_numbers:
30+
tracking_numbers.append(tracking_number)
31+
2732
return tracking_numbers

custom_components/email/sensor.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
from .parsers.sylvane import ATTR_SYLVANE, EMAIL_DOMAIN_SYLVANE, parse_sylvane
6262
from .parsers.adafruit import ATTR_ADAFRUIT, EMAIL_DOMAIN_ADAFRUIT, parse_adafruit
6363

64+
from .parsers.generic import ATTR_GENERIC, EMAIL_DOMAIN_GENERIC, parse_generic
65+
6466

6567
parsers = [
6668
(ATTR_UPS, EMAIL_DOMAIN_UPS, parse_ups),
@@ -106,12 +108,14 @@
106108
(ATTR_SONY, EMAIL_DOMAIN_SONY, parse_sony),
107109
(ATTR_SYLVANE, EMAIL_DOMAIN_SYLVANE, parse_sylvane),
108110
(ATTR_ADAFRUIT, EMAIL_DOMAIN_ADAFRUIT, parse_adafruit),
111+
112+
(ATTR_GENERIC, EMAIL_DOMAIN_GENERIC, parse_generic),
109113
]
110114

111115
_LOGGER = logging.getLogger(__name__)
112116

113117
DOMAIN = 'email'
114-
SCAN_INTERVAL = timedelta(seconds=5*60)
118+
SCAN_INTERVAL = timedelta(seconds=30*60)
115119

116120
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
117121
vol.Required(CONF_EMAIL): cv.string,
@@ -160,15 +164,15 @@
160164
ups_regex = "(" + ")|(".join(ups_pattern) + ")"
161165

162166
def find_carrier(tracking_number, email_domain):
163-
_LOGGER.debug(f'find_carrier email_domain: {email_domain}')
167+
_LOGGER.debug(f'find_carrier email_domain: {email_domain} {tracking_number}')
164168

165169
# we may have the carrier/link already parsed from parser
166170
if type(tracking_number) is dict:
167171
return {
168-
'tracking_number': tracking_number['tracking_number'],
172+
'tracking_number': tracking_number.get('tracking_number', ''),
169173
'carrier': email_domain,
170174
'origin': email_domain,
171-
'link': tracking_number['link'],
175+
'link': tracking_number.get('link', ''),
172176
}
173177

174178
link = ""

0 commit comments

Comments
 (0)