Skip to content

Commit

Permalink
updates
Browse files Browse the repository at this point in the history
  • Loading branch information
ljmerza committed Mar 30, 2023
1 parent e4e486a commit 8f27773
Show file tree
Hide file tree
Showing 25 changed files with 78 additions and 7 deletions.
Empty file modified .devcontainer/Dockerfile
100644 → 100755
Empty file.
Empty file modified .devcontainer/README.md
100644 → 100755
Empty file.
Empty file modified .devcontainer/configuration.yaml
100644 → 100755
Empty file.
Empty file modified .devcontainer/custom_component_helper
100644 → 100755
Empty file.
Empty file modified .devcontainer/devcontainer.json
100644 → 100755
Empty file.
Empty file modified .devcontainer/images/reopen.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified .github/ISSUE_TEMPLATE/feature_request.md
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/issue.md
100644 → 100755
Empty file.
Empty file modified .github/settings.yml
100644 → 100755
Empty file.
Empty file modified .gitignore
100644 → 100755
Empty file.
Empty file modified .vscode/tasks.json
100644 → 100755
Empty file.
Empty file modified CONTRIBUTING.md
100644 → 100755
Empty file.
Empty file modified LICENSE
100644 → 100755
Empty file.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Gets emails from IMAP and parses out any tracking numbers. Goes well with the [t

Supported Emails

- Adafruit
- Adam & Eve
- Amazon
- Ali Express
Expand Down Expand Up @@ -33,6 +34,7 @@ Supported Emails
- Prusa
- Reolink
- Rockauto
- Sylvane
- Sony
- Swiss Post
- Target
Expand Down
22 changes: 22 additions & 0 deletions custom_components/email/parsers/adafruit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import logging
import re

from bs4 import BeautifulSoup
from ..const import EMAIL_ATTR_BODY


_LOGGER = logging.getLogger(__name__)
ATTR_ADAFRUIT = 'adafruit'
EMAIL_DOMAIN_ADAFRUIT = 'adafruit.com'


def parse_adafruit(email):
"""Parse Adafruit tracking numbers."""
tracking_numbers = []

matches = re.findall(r'Delivery Confirmation ID is (.*?) ', email[EMAIL_ATTR_BODY])
for tracking_number in matches:
if tracking_number not in tracking_numbers:
tracking_numbers.append(tracking_number)

return tracking_numbers
3 changes: 0 additions & 3 deletions custom_components/email/parsers/adam_eve.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@ def parse_adam_and_eve(email):
"""Parse Adam & Eve tracking numbers."""
tracking_numbers = []

soup = BeautifulSoup(email[EMAIL_ATTR_BODY], 'html.parser')
paragraphs = soup.find_all('p')

soup = BeautifulSoup(email[EMAIL_ATTR_BODY], 'html.parser')
linkTexts = [link.text for link in soup.find_all('a')]
for linkText in linkTexts:
Expand Down
16 changes: 16 additions & 0 deletions custom_components/email/parsers/ali_express.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,28 @@ def parse_ali_express(email):
tracking_numbers = []

soup = BeautifulSoup(email[EMAIL_ATTR_BODY], 'html.parser')

lines = [p_element.text for p_element in soup.find_all('p')]
for line in lines:
if not line:
continue
match = re.search('TRACKING NUMBER :(.*?)\.', line)
if match and match.group(1) not in tracking_numbers:
tracking_numbers.append(match.group(1))

link_urls = [link.get('href') for link in soup.find_all('a')]
for link in link_urls:
if not link:
continue
order_number_match = re.search('orderId=(.*?)&', link)

if order_number_match and order_number_match.group(1):
order_number = order_number_match.group(1)
order_numbers = list(map(lambda x: x['tracking_number'], tracking_numbers))
if order_number not in order_numbers:
tracking_numbers.append({
'link': link,
'tracking_number': order_number
})

return tracking_numbers
2 changes: 1 addition & 1 deletion custom_components/email/parsers/fedex.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def parse_fedex(email):
for link in links:
if not link:
continue
match = re.search('tracknumbers=(.*?)&clienttype', link)
match = re.search('tracknumbers=(.*?)&', link)
if match and match.group(1) not in tracking_numbers:
tracking_numbers.append(match.group(1))

Expand Down
2 changes: 1 addition & 1 deletion custom_components/email/parsers/monoprice.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def parse_monoprice(email):
for link in links:
if not link:
continue
match = re.search('TRK=(.*?)&CAR', link)
match = re.search('TRK=(.*?)&', link)
if match and match.group(1) not in tracking_numbers:
tracking_numbers.append(match.group(1))

Expand Down
2 changes: 1 addition & 1 deletion custom_components/email/parsers/newegg.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def parse_newegg(email):
for link in link_urls:
if not link:
continue
match = re.search('TrackingNumber=(.*?)&type=0', link)
match = re.search('TrackingNumber=(.*?)&', link)
if match and match.group(1) not in tracking_numbers:
tracking_numbers.append(match.group(1))

Expand Down
26 changes: 26 additions & 0 deletions custom_components/email/parsers/sylvane.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import logging
import re

from bs4 import BeautifulSoup
from ..const import EMAIL_ATTR_BODY


_LOGGER = logging.getLogger(__name__)
ATTR_SYLVANE = 'sylvane'
EMAIL_DOMAIN_SYLVANE = 'sylvane.com'


def parse_sylvane(email):
"""Parse Sylvane tracking numbers."""
tracking_numbers = []

soup = BeautifulSoup(email[EMAIL_ATTR_BODY], 'html.parser')
links = [link.get('href') for link in soup.find_all('a')]
for link in links:
if not link:
continue
match = re.search('trknbr=(.*?)$', link)
if match and match.group(1) not in tracking_numbers:
tracking_numbers.append(match.group(1))

return tracking_numbers
2 changes: 1 addition & 1 deletion custom_components/email/parsers/usps.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def parse_usps(email):
for link in links:
if not link:
continue
match = re.search('selectedTrckNum=(.*?)&selectedTypeOfLabel', link)
match = re.search('selectedTrckNum=(.*?)&', link)
if match and match.group(1) not in tracking_numbers:
tracking_numbers.append(match.group(1))
match = re.search('tLabels=(.*?)&', link)
Expand Down
8 changes: 8 additions & 0 deletions custom_components/email/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@
from .parsers.pledgebox import ATTR_PLEDGEBOX, EMAIL_DOMAIN_PLEDGEBOX, parse_pledgebox
from .parsers.guitar_center import ATTR_GUITAR_CENTER, EMAIL_DOMAIN_GUITAR_CENTER, parse_guitar_center
from .parsers.sony import ATTR_SONY, EMAIL_DOMAIN_SONY, parse_sony
from .parsers.sylvane import ATTR_SYLVANE, EMAIL_DOMAIN_SYLVANE, parse_sylvane
from .parsers.adafruit import ATTR_ADAFRUIT, EMAIL_DOMAIN_ADAFRUIT, parse_adafruit


parsers = [
Expand Down Expand Up @@ -102,6 +104,8 @@
(ATTR_PLEDGEBOX, EMAIL_DOMAIN_PLEDGEBOX, parse_pledgebox),
(ATTR_GUITAR_CENTER, EMAIL_DOMAIN_GUITAR_CENTER, parse_guitar_center),
(ATTR_SONY, EMAIL_DOMAIN_SONY, parse_sony),
(ATTR_SYLVANE, EMAIL_DOMAIN_SYLVANE, parse_sylvane),
(ATTR_ADAFRUIT, EMAIL_DOMAIN_ADAFRUIT, parse_adafruit),
]

_LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -156,6 +160,7 @@
ups_regex = "(" + ")|(".join(ups_pattern) + ")"

def find_carrier(tracking_number, email_domain):
_LOGGER.debug(f'find_carrier email_domain: {email_domain}')

# we may have the carrier/link already parsed from parser
if type(tracking_number) is dict:
Expand Down Expand Up @@ -298,12 +303,14 @@ def update(self):
# for each email run each parser and save in the corresponding ATTR
for email in emails:
email_from = email[EMAIL_ATTR_FROM]
_LOGGER.debug(f'parsing email from {email_from}')
if isinstance(email_from, (list, tuple)):
email_from = list(email_from)
email_from = ''.join(list(email_from[0]))

# run through all parsers for each email if email domain matches
for ATTR, EMAIL_DOMAIN, parser in parsers:
_LOGGER.debug(f'parsing email for parser {EMAIL_DOMAIN}')
try:
if EMAIL_DOMAIN in email_from:
self._attr[ATTR_TRACKING_NUMBERS][ATTR] = self._attr[ATTR_TRACKING_NUMBERS][ATTR] + parser(email=email)
Expand All @@ -320,6 +327,7 @@ def update(self):

# format tracking numbers to add carrier type
for ATTR, EMAIL_DOMAIN, parser in parsers:
_LOGGER.debug(f'parsing tracking numbers for {EMAIL_DOMAIN}')
tracking_numbers = self._attr[ATTR_TRACKING_NUMBERS][ATTR]
self._attr[ATTR_TRACKING_NUMBERS][ATTR] = list(map(lambda x: find_carrier(x, EMAIL_DOMAIN), tracking_numbers))
_LOGGER.debug(self._attr[ATTR_TRACKING_NUMBERS][ATTR])
Expand Down
Empty file modified hacs.json
100644 → 100755
Empty file.
Empty file modified requirements.txt
100644 → 100755
Empty file.

0 comments on commit 8f27773

Please sign in to comment.