summaryrefslogtreecommitdiffhomepage
path: root/libs
diff options
context:
space:
mode:
authormorpheus65535 <[email protected]>2024-05-24 13:19:37 -0400
committermorpheus65535 <[email protected]>2024-05-24 13:19:37 -0400
commit5ca733eac0ec43ebd3ca68e867bfd6ef0fb30cc2 (patch)
treed1799076dea9254294609ea3d4ca9178d3e321f7 /libs
parent3e929d8ef90fcb77bba0abeb4662d4d5e2882e6a (diff)
downloadbazarr-5ca733eac0ec43ebd3ca68e867bfd6ef0fb30cc2.tar.gz
bazarr-5ca733eac0ec43ebd3ca68e867bfd6ef0fb30cc2.zip
Reverted to apprise 1.7.6 to fix an issue with the upgrade process first. 1.8.0 will get back in nightly shortly. #2497v1.4.3-beta.40
Diffstat (limited to 'libs')
-rw-r--r--libs/apprise-1.7.6.dist-info/INSTALLER (renamed from libs/apprise-1.8.0.dist-info/INSTALLER)0
-rw-r--r--libs/apprise-1.7.6.dist-info/LICENSE (renamed from libs/apprise-1.8.0.dist-info/LICENSE)0
-rw-r--r--libs/apprise-1.7.6.dist-info/METADATA (renamed from libs/apprise-1.8.0.dist-info/METADATA)2
-rw-r--r--libs/apprise-1.7.6.dist-info/RECORD183
-rw-r--r--libs/apprise-1.7.6.dist-info/REQUESTED (renamed from libs/apprise-1.8.0.dist-info/REQUESTED)0
-rw-r--r--libs/apprise-1.7.6.dist-info/WHEEL (renamed from libs/apprise-1.8.0.dist-info/WHEEL)0
-rw-r--r--libs/apprise-1.7.6.dist-info/entry_points.txt (renamed from libs/apprise-1.8.0.dist-info/entry_points.txt)0
-rw-r--r--libs/apprise-1.7.6.dist-info/top_level.txt (renamed from libs/apprise-1.8.0.dist-info/top_level.txt)0
-rw-r--r--libs/apprise-1.8.0.dist-info/RECORD183
-rw-r--r--libs/apprise/Apprise.py887
-rw-r--r--libs/apprise/Apprise.pyi62
-rw-r--r--libs/apprise/AppriseAsset.py (renamed from libs/apprise/asset.py)2
-rw-r--r--libs/apprise/AppriseAsset.pyi (renamed from libs/apprise/asset.pyi)0
-rw-r--r--libs/apprise/AppriseAttachment.py (renamed from libs/apprise/apprise_attachment.py)6
-rw-r--r--libs/apprise/AppriseAttachment.pyi (renamed from libs/apprise/apprise_attachment.pyi)0
-rw-r--r--libs/apprise/AppriseConfig.py (renamed from libs/apprise/apprise_config.py)4
-rw-r--r--libs/apprise/AppriseConfig.pyi (renamed from libs/apprise/apprise_config.pyi)0
-rw-r--r--libs/apprise/AppriseLocale.py (renamed from libs/apprise/locale.py)0
-rw-r--r--libs/apprise/AttachmentManager.py (renamed from libs/apprise/manager_attachment.py)5
-rw-r--r--libs/apprise/ConfigurationManager.py (renamed from libs/apprise/manager_config.py)5
-rw-r--r--libs/apprise/NotificationManager.py (renamed from libs/apprise/manager_plugins.py)6
-rw-r--r--libs/apprise/URLBase.py (renamed from libs/apprise/url.py)9
-rw-r--r--libs/apprise/URLBase.pyi (renamed from libs/apprise/url.pyi)0
-rw-r--r--libs/apprise/__init__.py23
-rw-r--r--libs/apprise/attachment/AttachBase.py (renamed from libs/apprise/attachment/base.py)9
-rw-r--r--libs/apprise/attachment/AttachBase.pyi (renamed from libs/apprise/attachment/base.pyi)0
-rw-r--r--libs/apprise/attachment/AttachFile.py (renamed from libs/apprise/attachment/file.py)4
-rw-r--r--libs/apprise/attachment/AttachHTTP.py (renamed from libs/apprise/attachment/http.py)12
-rw-r--r--libs/apprise/attachment/__init__.py5
-rw-r--r--libs/apprise/config/ConfigBase.py (renamed from libs/apprise/config/base.py)8
-rw-r--r--libs/apprise/config/ConfigBase.pyi (renamed from libs/apprise/config/base.pyi)0
-rw-r--r--libs/apprise/config/ConfigFile.py (renamed from libs/apprise/config/file.py)4
-rw-r--r--libs/apprise/config/ConfigHTTP.py (renamed from libs/apprise/config/http.py)6
-rw-r--r--libs/apprise/config/ConfigMemory.py (renamed from libs/apprise/config/memory.py)4
-rw-r--r--libs/apprise/config/__init__.py5
-rw-r--r--libs/apprise/conversion.py2
-rw-r--r--libs/apprise/decorators/CustomNotifyPlugin.py (renamed from libs/apprise/decorators/base.py)7
-rw-r--r--libs/apprise/decorators/notify.py2
-rw-r--r--libs/apprise/i18n/en/LC_MESSAGES/apprise.mobin3959 -> 3959 bytes
-rw-r--r--libs/apprise/manager.py83
-rw-r--r--libs/apprise/plugins/NotifyAppriseAPI.py (renamed from libs/apprise/plugins/apprise_api.py)8
-rw-r--r--libs/apprise/plugins/NotifyAprs.py (renamed from libs/apprise/plugins/aprs.py)6
-rw-r--r--libs/apprise/plugins/NotifyBark.py (renamed from libs/apprise/plugins/bark.py)6
-rw-r--r--libs/apprise/plugins/NotifyBase.py (renamed from libs/apprise/plugins/base.py)6
-rw-r--r--libs/apprise/plugins/NotifyBase.pyi (renamed from libs/apprise/plugins/base.pyi)0
-rw-r--r--libs/apprise/plugins/NotifyBoxcar.py (renamed from libs/apprise/plugins/boxcar.py)6
-rw-r--r--libs/apprise/plugins/NotifyBulkSMS.py (renamed from libs/apprise/plugins/bulksms.py)6
-rw-r--r--libs/apprise/plugins/NotifyBulkVS.py (renamed from libs/apprise/plugins/bulkvs.py)6
-rw-r--r--libs/apprise/plugins/NotifyBurstSMS.py (renamed from libs/apprise/plugins/burstsms.py)6
-rw-r--r--libs/apprise/plugins/NotifyChantify.py (renamed from libs/apprise/plugins/chantify.py)4
-rw-r--r--libs/apprise/plugins/NotifyClickSend.py (renamed from libs/apprise/plugins/clicksend.py)27
-rw-r--r--libs/apprise/plugins/NotifyD7Networks.py (renamed from libs/apprise/plugins/d7networks.py)4
-rw-r--r--libs/apprise/plugins/NotifyDBus.py (renamed from libs/apprise/plugins/dbus.py)4
-rw-r--r--libs/apprise/plugins/NotifyDapnet.py (renamed from libs/apprise/plugins/dapnet.py)6
-rw-r--r--libs/apprise/plugins/NotifyDingTalk.py (renamed from libs/apprise/plugins/dingtalk.py)6
-rw-r--r--libs/apprise/plugins/NotifyDiscord.py (renamed from libs/apprise/plugins/discord.py)6
-rw-r--r--libs/apprise/plugins/NotifyEmail.py (renamed from libs/apprise/plugins/email.py)16
-rw-r--r--libs/apprise/plugins/NotifyEmby.py (renamed from libs/apprise/plugins/emby.py)6
-rw-r--r--libs/apprise/plugins/NotifyEnigma2.py (renamed from libs/apprise/plugins/enigma2.py)6
-rw-r--r--libs/apprise/plugins/NotifyFCM/__init__.py (renamed from libs/apprise/plugins/fcm/__init__.py)6
-rw-r--r--libs/apprise/plugins/NotifyFCM/color.py (renamed from libs/apprise/plugins/fcm/color.py)2
-rw-r--r--libs/apprise/plugins/NotifyFCM/common.py (renamed from libs/apprise/plugins/fcm/common.py)0
-rw-r--r--libs/apprise/plugins/NotifyFCM/oauth.py (renamed from libs/apprise/plugins/fcm/oauth.py)0
-rw-r--r--libs/apprise/plugins/NotifyFCM/priority.py (renamed from libs/apprise/plugins/fcm/priority.py)0
-rw-r--r--libs/apprise/plugins/NotifyFeishu.py (renamed from libs/apprise/plugins/feishu.py)4
-rw-r--r--libs/apprise/plugins/NotifyFlock.py (renamed from libs/apprise/plugins/flock.py)4
-rw-r--r--libs/apprise/plugins/NotifyForm.py (renamed from libs/apprise/plugins/custom_form.py)6
-rw-r--r--libs/apprise/plugins/NotifyFreeMobile.py (renamed from libs/apprise/plugins/freemobile.py)5
-rw-r--r--libs/apprise/plugins/NotifyGnome.py (renamed from libs/apprise/plugins/gnome.py)4
-rw-r--r--libs/apprise/plugins/NotifyGoogleChat.py (renamed from libs/apprise/plugins/google_chat.py)4
-rw-r--r--libs/apprise/plugins/NotifyGotify.py (renamed from libs/apprise/plugins/gotify.py)4
-rw-r--r--libs/apprise/plugins/NotifyGrowl.py (renamed from libs/apprise/plugins/growl.py)6
-rw-r--r--libs/apprise/plugins/NotifyGuilded.py (renamed from libs/apprise/plugins/guilded.py)5
-rw-r--r--libs/apprise/plugins/NotifyHomeAssistant.py (renamed from libs/apprise/plugins/home_assistant.py)6
-rw-r--r--libs/apprise/plugins/NotifyHttpSMS.py (renamed from libs/apprise/plugins/httpsms.py)4
-rw-r--r--libs/apprise/plugins/NotifyIFTTT.py (renamed from libs/apprise/plugins/ifttt.py)4
-rw-r--r--libs/apprise/plugins/NotifyJSON.py (renamed from libs/apprise/plugins/custom_json.py)6
-rw-r--r--libs/apprise/plugins/NotifyJoin.py (renamed from libs/apprise/plugins/join.py)4
-rw-r--r--libs/apprise/plugins/NotifyKavenegar.py (renamed from libs/apprise/plugins/kavenegar.py)4
-rw-r--r--libs/apprise/plugins/NotifyKumulos.py (renamed from libs/apprise/plugins/kumulos.py)4
-rw-r--r--libs/apprise/plugins/NotifyLametric.py (renamed from libs/apprise/plugins/lametric.py)4
-rw-r--r--libs/apprise/plugins/NotifyLine.py (renamed from libs/apprise/plugins/line.py)6
-rw-r--r--libs/apprise/plugins/NotifyLunaSea.py (renamed from libs/apprise/plugins/lunasea.py)6
-rw-r--r--libs/apprise/plugins/NotifyMQTT.py (renamed from libs/apprise/plugins/mqtt.py)6
-rw-r--r--libs/apprise/plugins/NotifyMSG91.py (renamed from libs/apprise/plugins/msg91.py)4
-rw-r--r--libs/apprise/plugins/NotifyMSTeams.py (renamed from libs/apprise/plugins/msteams.py)6
-rw-r--r--libs/apprise/plugins/NotifyMacOSX.py (renamed from libs/apprise/plugins/macosx.py)4
-rw-r--r--libs/apprise/plugins/NotifyMailgun.py (renamed from libs/apprise/plugins/mailgun.py)4
-rw-r--r--libs/apprise/plugins/NotifyMastodon.py (renamed from libs/apprise/plugins/mastodon.py)8
-rw-r--r--libs/apprise/plugins/NotifyMatrix.py (renamed from libs/apprise/plugins/matrix.py)6
-rw-r--r--libs/apprise/plugins/NotifyMattermost.py (renamed from libs/apprise/plugins/mattermost.py)4
-rw-r--r--libs/apprise/plugins/NotifyMessageBird.py (renamed from libs/apprise/plugins/messagebird.py)4
-rw-r--r--libs/apprise/plugins/NotifyMisskey.py (renamed from libs/apprise/plugins/misskey.py)4
-rw-r--r--libs/apprise/plugins/NotifyNextcloud.py (renamed from libs/apprise/plugins/nextcloud.py)6
-rw-r--r--libs/apprise/plugins/NotifyNextcloudTalk.py (renamed from libs/apprise/plugins/nextcloudtalk.py)6
-rw-r--r--libs/apprise/plugins/NotifyNotica.py (renamed from libs/apprise/plugins/notica.py)6
-rw-r--r--libs/apprise/plugins/NotifyNotifiarr.py (renamed from libs/apprise/plugins/notifiarr.py)4
-rw-r--r--libs/apprise/plugins/NotifyNotifico.py (renamed from libs/apprise/plugins/notifico.py)4
-rw-r--r--libs/apprise/plugins/NotifyNtfy.py (renamed from libs/apprise/plugins/ntfy.py)8
-rw-r--r--libs/apprise/plugins/NotifyOffice365.py (renamed from libs/apprise/plugins/office365.py)6
-rw-r--r--libs/apprise/plugins/NotifyOneSignal.py (renamed from libs/apprise/plugins/one_signal.py)4
-rw-r--r--libs/apprise/plugins/NotifyOpsgenie.py (renamed from libs/apprise/plugins/opsgenie.py)4
-rw-r--r--libs/apprise/plugins/NotifyPagerDuty.py (renamed from libs/apprise/plugins/pagerduty.py)6
-rw-r--r--libs/apprise/plugins/NotifyPagerTree.py (renamed from libs/apprise/plugins/pagertree.py)4
-rw-r--r--libs/apprise/plugins/NotifyParsePlatform.py (renamed from libs/apprise/plugins/parseplatform.py)4
-rw-r--r--libs/apprise/plugins/NotifyPopcornNotify.py (renamed from libs/apprise/plugins/popcorn_notify.py)4
-rw-r--r--libs/apprise/plugins/NotifyProwl.py (renamed from libs/apprise/plugins/prowl.py)4
-rw-r--r--libs/apprise/plugins/NotifyPushBullet.py (renamed from libs/apprise/plugins/pushbullet.py)6
-rw-r--r--libs/apprise/plugins/NotifyPushDeer.py (renamed from libs/apprise/plugins/pushdeer.py)4
-rw-r--r--libs/apprise/plugins/NotifyPushMe.py (renamed from libs/apprise/plugins/pushme.py)4
-rw-r--r--libs/apprise/plugins/NotifyPushSafer.py (renamed from libs/apprise/plugins/pushsafer.py)4
-rw-r--r--libs/apprise/plugins/NotifyPushed.py (renamed from libs/apprise/plugins/pushed.py)6
-rw-r--r--libs/apprise/plugins/NotifyPushjet.py (renamed from libs/apprise/plugins/pushjet.py)6
-rw-r--r--libs/apprise/plugins/NotifyPushover.py (renamed from libs/apprise/plugins/pushover.py)6
-rw-r--r--libs/apprise/plugins/NotifyPushy.py (renamed from libs/apprise/plugins/pushy.py)4
-rw-r--r--libs/apprise/plugins/NotifyRSyslog.py (renamed from libs/apprise/plugins/rsyslog.py)4
-rw-r--r--libs/apprise/plugins/NotifyReddit.py (renamed from libs/apprise/plugins/reddit.py)6
-rw-r--r--libs/apprise/plugins/NotifyRevolt.py (renamed from libs/apprise/plugins/revolt.py)4
-rw-r--r--libs/apprise/plugins/NotifyRocketChat.py (renamed from libs/apprise/plugins/rocketchat.py)6
-rw-r--r--libs/apprise/plugins/NotifyRyver.py (renamed from libs/apprise/plugins/ryver.py)4
-rw-r--r--libs/apprise/plugins/NotifySES.py (renamed from libs/apprise/plugins/ses.py)6
-rw-r--r--libs/apprise/plugins/NotifySMSEagle.py (renamed from libs/apprise/plugins/smseagle.py)6
-rw-r--r--libs/apprise/plugins/NotifySMSManager.py (renamed from libs/apprise/plugins/smsmanager.py)4
-rw-r--r--libs/apprise/plugins/NotifySMTP2Go.py (renamed from libs/apprise/plugins/smtp2go.py)4
-rw-r--r--libs/apprise/plugins/NotifySNS.py (renamed from libs/apprise/plugins/sns.py)6
-rw-r--r--libs/apprise/plugins/NotifySendGrid.py (renamed from libs/apprise/plugins/sendgrid.py)4
-rw-r--r--libs/apprise/plugins/NotifyServerChan.py (renamed from libs/apprise/plugins/serverchan.py)4
-rw-r--r--libs/apprise/plugins/NotifySignalAPI.py (renamed from libs/apprise/plugins/signal_api.py)6
-rw-r--r--libs/apprise/plugins/NotifySimplePush.py (renamed from libs/apprise/plugins/simplepush.py)6
-rw-r--r--libs/apprise/plugins/NotifySinch.py (renamed from libs/apprise/plugins/sinch.py)6
-rw-r--r--libs/apprise/plugins/NotifySlack.py (renamed from libs/apprise/plugins/slack.py)4
-rw-r--r--libs/apprise/plugins/NotifySparkPost.py (renamed from libs/apprise/plugins/sparkpost.py)4
-rw-r--r--libs/apprise/plugins/NotifyStreamlabs.py (renamed from libs/apprise/plugins/streamlabs.py)4
-rw-r--r--libs/apprise/plugins/NotifySynology.py (renamed from libs/apprise/plugins/synology.py)6
-rw-r--r--libs/apprise/plugins/NotifySyslog.py (renamed from libs/apprise/plugins/syslog.py)4
-rw-r--r--libs/apprise/plugins/NotifyTechulusPush.py (renamed from libs/apprise/plugins/techuluspush.py)4
-rw-r--r--libs/apprise/plugins/NotifyTelegram.py (renamed from libs/apprise/plugins/telegram.py)6
-rw-r--r--libs/apprise/plugins/NotifyThreema.py (renamed from libs/apprise/plugins/threema.py)6
-rw-r--r--libs/apprise/plugins/NotifyTwilio.py (renamed from libs/apprise/plugins/twilio.py)6
-rw-r--r--libs/apprise/plugins/NotifyTwist.py (renamed from libs/apprise/plugins/twist.py)6
-rw-r--r--libs/apprise/plugins/NotifyTwitter.py (renamed from libs/apprise/plugins/twitter.py)8
-rw-r--r--libs/apprise/plugins/NotifyVoipms.py (renamed from libs/apprise/plugins/voipms.py)4
-rw-r--r--libs/apprise/plugins/NotifyVonage.py (renamed from libs/apprise/plugins/vonage.py)6
-rw-r--r--libs/apprise/plugins/NotifyWeComBot.py (renamed from libs/apprise/plugins/wecombot.py)4
-rw-r--r--libs/apprise/plugins/NotifyWebexTeams.py (renamed from libs/apprise/plugins/webexteams.py)4
-rw-r--r--libs/apprise/plugins/NotifyWhatsApp.py (renamed from libs/apprise/plugins/whatsapp.py)4
-rw-r--r--libs/apprise/plugins/NotifyWindows.py (renamed from libs/apprise/plugins/windows.py)4
-rw-r--r--libs/apprise/plugins/NotifyXBMC.py (renamed from libs/apprise/plugins/xbmc.py)6
-rw-r--r--libs/apprise/plugins/NotifyXML.py (renamed from libs/apprise/plugins/custom_xml.py)6
-rw-r--r--libs/apprise/plugins/NotifyZulip.py (renamed from libs/apprise/plugins/zulip.py)4
-rw-r--r--libs/apprise/plugins/__init__.py8
-rw-r--r--libs/apprise/utils.py13
-rw-r--r--libs/version.txt2
153 files changed, 1511 insertions, 609 deletions
diff --git a/libs/apprise-1.8.0.dist-info/INSTALLER b/libs/apprise-1.7.6.dist-info/INSTALLER
index a1b589e38..a1b589e38 100644
--- a/libs/apprise-1.8.0.dist-info/INSTALLER
+++ b/libs/apprise-1.7.6.dist-info/INSTALLER
diff --git a/libs/apprise-1.8.0.dist-info/LICENSE b/libs/apprise-1.7.6.dist-info/LICENSE
index f9154fefe..f9154fefe 100644
--- a/libs/apprise-1.8.0.dist-info/LICENSE
+++ b/libs/apprise-1.7.6.dist-info/LICENSE
diff --git a/libs/apprise-1.8.0.dist-info/METADATA b/libs/apprise-1.7.6.dist-info/METADATA
index c01ef211a..ac7cb9aac 100644
--- a/libs/apprise-1.8.0.dist-info/METADATA
+++ b/libs/apprise-1.7.6.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: apprise
-Version: 1.8.0
+Version: 1.7.6
Summary: Push Notifications that work with just about every platform!
Home-page: https://github.com/caronc/apprise
Author: Chris Caron
diff --git a/libs/apprise-1.7.6.dist-info/RECORD b/libs/apprise-1.7.6.dist-info/RECORD
new file mode 100644
index 000000000..250648105
--- /dev/null
+++ b/libs/apprise-1.7.6.dist-info/RECORD
@@ -0,0 +1,183 @@
+../../bin/apprise,sha256=ZJ-e4qqxNLtdW_DAvpuPPX5iROIiQd8I6nvg7vtAv-g,233
+apprise-1.7.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+apprise-1.7.6.dist-info/LICENSE,sha256=gt7qKBxRhVcdmXCYVtrWP6DtYjD0DzONet600dkU994,1343
+apprise-1.7.6.dist-info/METADATA,sha256=z_gaX2IdNJqw4T9q7AYQri9jcIs-OTGCo3t2EgEY-mw,44823
+apprise-1.7.6.dist-info/RECORD,,
+apprise-1.7.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+apprise-1.7.6.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
+apprise-1.7.6.dist-info/entry_points.txt,sha256=71YypBuNdjAKiaLsiMG40HEfLHxkU4Mi7o_S0s0d8wI,45
+apprise-1.7.6.dist-info/top_level.txt,sha256=JrCRn-_rXw5LMKXkIgMSE4E0t1Ks9TYrBH54Pflwjkk,8
+apprise/Apprise.py,sha256=Stm2NhJprWRaMwQfTiIQG_nR1bLpHi_zcdwEcsCpa-A,32865
+apprise/Apprise.pyi,sha256=_4TBKvT-QVj3s6PuTh3YX-BbQMeJTdBGdVpubLMY4_k,2203
+apprise/AppriseAsset.py,sha256=jRW8Y1EcAvjVA9h_mINmsjO4DM3S0aDl6INIFVMcUCs,11647
+apprise/AppriseAsset.pyi,sha256=NYLXXYbScgRkspP27XGpRRM_uliPu1OCdWdZBPPvLng,979
+apprise/AppriseAttachment.py,sha256=vhrktSrp8GLr32aK4KqV6BX83IpI1lxZe-pGo1wiSFM,12540
+apprise/AppriseAttachment.pyi,sha256=R9-0dVqWpeaFrVpcREwPhGy3qHWztG5jEjYIOsbE5dM,1145
+apprise/AppriseConfig.py,sha256=wfuR6Mb3ZLHvjvqWdFp9lVmjjDRWs65unY9qa92RkCg,16909
+apprise/AppriseConfig.pyi,sha256=_mUlCnncqAq8sL01WxQTgZjnb2ic9kZXvtqZmVl-fc8,1568
+apprise/AppriseLocale.py,sha256=4uSr4Nj_rz6ISMMAfRVRk58wZVLKOofJgk2x0_E8NkQ,8994
+apprise/AttachmentManager.py,sha256=EwlnjuKn3fv_pioWcmMCkyDTsO178t6vkEOD8AjAPsw,2053
+apprise/ConfigurationManager.py,sha256=MUmGajxjgnr6FGN7xb3q0nD0VVgdTdvapBBR7CsI-rc,2058
+apprise/NotificationManager.py,sha256=ZJgkiCgcJ7Bz_6bwQ47flrcxvLMbA4Vbw0HG_yTsGdE,2041
+apprise/URLBase.py,sha256=xRP0-blocp9UudYh04Hb3fIEmTZWJaTv_tzjrqaB9fg,29423
+apprise/URLBase.pyi,sha256=WLaRREH7FzZ5x3-qkDkupojWGFC4uFwJ1EDt02lVs8c,520
+apprise/__init__.py,sha256=ArtvoarAMnBcSfXF7L_hzq5CUJ9TUnHopiC7xafCe3c,3368
+apprise/assets/NotifyXML-1.0.xsd,sha256=292qQ_IUl5EWDhPyzm9UTT0C2rVvJkyGar8jiODkJs8,986
+apprise/assets/NotifyXML-1.1.xsd,sha256=bjR3CGG4AEXoJjYkGCbDttKHSkPP1FlIWO02E7G59g4,1758
+apprise/assets/themes/default/apprise-failure-128x128.ico,sha256=Mt0ptfHJaN3Wsv5UCNDn9_3lyEDHxVDv1JdaDEI_xCA,67646
+apprise/assets/themes/default/apprise-failure-128x128.png,sha256=66ps8TDPxVH3g9PlObJqF-0x952CjnqQyN3zvpRcOT8,16135
+apprise/assets/themes/default/apprise-failure-256x256.png,sha256=bQBsKKCsKfR9EqgYOZrcVcVa5y8qG58PN2mEqO5eNRI,41931
+apprise/assets/themes/default/apprise-failure-32x32.png,sha256=vH0pZffIDCvkejpr3fJHGXW__8Yc3R_p0bacX6t6l18,2437
+apprise/assets/themes/default/apprise-failure-72x72.png,sha256=EP5A8DHRDr9srgupFSwOoyQ308bNJ8aL192J_L4K-ec,7600
+apprise/assets/themes/default/apprise-info-128x128.ico,sha256=F5_CirmXueRCRI5Z_Crf6TS6jVIXTJlRD83zw1oJ66g,67646
+apprise/assets/themes/default/apprise-info-128x128.png,sha256=bBqRZAgQey-gkmJrnFhPbzjILSrljE59mRkgj3raMQo,16671
+apprise/assets/themes/default/apprise-info-256x256.png,sha256=B5r_O4d9MHCmSWZwfbqQgZSp-ZetTdiBSwKcMTF1aFA,43331
+apprise/assets/themes/default/apprise-info-32x32.png,sha256=lt3NZ95TzkiCNVNlurrB2fE2nriMa1wftl7nrNXmb6c,2485
+apprise/assets/themes/default/apprise-info-72x72.png,sha256=kDnsZpqNUZGqs9t1ECUup7FOfXUIL-rupnQCYJp9So4,7875
+apprise/assets/themes/default/apprise-logo.png,sha256=85ttALudKkLmiqilJT7mUQLUXRFmM1AK89rnwLm313s,160907
+apprise/assets/themes/default/apprise-success-128x128.ico,sha256=uCopPwdQjxgfohKazHaDzYs9y4oiaOpL048PYC6WRlg,67646
+apprise/assets/themes/default/apprise-success-128x128.png,sha256=nvDuU_QqhGlw6cMtdj7Mv-gPgqCEx-0DaaXn1KBLVYg,17446
+apprise/assets/themes/default/apprise-success-256x256.png,sha256=vXfKuxY3n0eeXHKdb9hTxICxOEn7HjAQ4IZpX0HSLzc,48729
+apprise/assets/themes/default/apprise-success-32x32.png,sha256=Jg9pFJh3YPI-LiPBebyJ7Z4Vt7BRecaE8AsRjQVIkME,2471
+apprise/assets/themes/default/apprise-success-72x72.png,sha256=FQbgvIhqKOhEK0yvrhaSpai0R7hrkTt_-GaC2KUgCCk,7858
+apprise/assets/themes/default/apprise-warning-128x128.ico,sha256=6XaQPOx0oWK_xbhr4Yhb7qNazCWwSs9lk2SYR2MHTrQ,67646
+apprise/assets/themes/default/apprise-warning-128x128.png,sha256=pf5c4Ph7jWH7gf39dJoieSj8TzAsY3TXI-sGISGVIW4,16784
+apprise/assets/themes/default/apprise-warning-256x256.png,sha256=SY-xlaiXaj420iEYKC2_fJxU-yj2SuaQg6xfPNi83bw,43708
+apprise/assets/themes/default/apprise-warning-32x32.png,sha256=97R2ywNvcwczhBoWEIgajVtWjgT8fLs4FCCz4wu0dwc,2472
+apprise/assets/themes/default/apprise-warning-72x72.png,sha256=L8moEInkO_OLxoOcuvN7rmrGZo64iJeH20o-24MQghE,7913
+apprise/attachment/AttachBase.py,sha256=T3WreGrTsqqGplXJO36jm-N14X7ymSc9xt7XdTYuXVE,13656
+apprise/attachment/AttachBase.pyi,sha256=w0XG_QKauiMLJ7eQ4S57IiLIURZHm_Snw7l6-ih9GP8,961
+apprise/attachment/AttachFile.py,sha256=MbHY_av0GeM_AIBKV02Hq7SHiZ9eCr1yTfvDMUgi2I4,4765
+apprise/attachment/AttachHTTP.py,sha256=_CMPp4QGLATfGO2-Nw57sxsQyed9z3ywgoB0vpK3KZk,13779
+apprise/attachment/__init__.py,sha256=xabgXpvV05X-YRuqIt3uGYMXwYNXjHyF6Dwd8HfZCFE,1658
+apprise/cli.py,sha256=h-pWSQPqQficH6J-OEp3MTGydWyt6vMYnDZvHCeAt4Y,20697
+apprise/common.py,sha256=I6wfrndggCL7l7KAl7Cm4uwAX9n0l3SN4-BVvTE0L0M,5593
+apprise/common.pyi,sha256=luF3QRiClDCk8Z23rI6FCGYsVmodOt_JYfYyzGogdNM,447
+apprise/config/ConfigBase.py,sha256=d1efIuQFCJr66WgpudV2DWtxY3-tuZAyMAhHXBzJ8p0,53194
+apprise/config/ConfigBase.pyi,sha256=cngfobwH6v2vxYbQrObDi5Z-t5wcquWF-wR0kBCr3Eg,54
+apprise/config/ConfigFile.py,sha256=u_SDaN3OHMyaAq2X7k_T4_PRKkVsDwleqBz9YIN5lbA,6138
+apprise/config/ConfigHTTP.py,sha256=Iy6Ji8_nX3xDjFgJGLrz4ftrMlMiyKiFGzYGJ7rMSMQ,9457
+apprise/config/ConfigMemory.py,sha256=epEAgNy-eJVWoQaUOvjivMWxXTofy6wAQ-NbCqYmuyE,2829
+apprise/config/__init__.py,sha256=lbsxrUpB1IYM2q7kjYhsXQGgPF-yZXJrKFE361tdIPY,1663
+apprise/conversion.py,sha256=0VZ0eCZfksN-97Vl0TjVjwnCTgus3XTRioceSFnP-gc,6277
+apprise/decorators/CustomNotifyPlugin.py,sha256=i4D-sgOsBWsxO5auWCN2bgXLLPuADaaLlJ1gUKLj2bU,7972
+apprise/decorators/__init__.py,sha256=e_PDAm0kQNzwDPx-NJZLPfLMd2VAABvNZtxx_iDviRM,1487
+apprise/decorators/notify.py,sha256=a2WupErNw1_SMAld7jPC273bskiChMpYy95BOog5A9w,5111
+apprise/emojis.py,sha256=ONF0t8dY9f2XlEkLUG79-ybKVAj2GqbPj2-Be97vAoI,87738
+apprise/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+apprise/i18n/en/LC_MESSAGES/apprise.mo,sha256=oUTuHREmLEYN07oqYqRMJ_kU71-o5o37NsF4RXlC5AU,3959
+apprise/logger.py,sha256=131hqhed8cUj9x_mfXDEvwA2YbcYDFAYiWVK1HgxRVY,6921
+apprise/manager.py,sha256=R9w8jxQRNy6Z_XDcobkt4JYbrC4jtj2OwRw9Zrib3CA,26857
+apprise/plugins/NotifyAppriseAPI.py,sha256=ISBE0brD3eQdyw3XrGXd4Uc4kSYvIuI3SSUVCt-bkdo,16654
+apprise/plugins/NotifyAprs.py,sha256=xdL_aIVgb4ggxRFeCdkZAbgHYZ8DWLw9pRpLZQ0rHoE,25523
+apprise/plugins/NotifyBark.py,sha256=bsDvKooRy4k1Gg7tvBjv3DIx7-WZiV_mbTrkTwMtd9Q,15698
+apprise/plugins/NotifyBase.py,sha256=G3xkF_a2BWqNSxsrnOW7NUgHjOqBCYC5zihCifWemo8,30360
+apprise/plugins/NotifyBase.pyi,sha256=aKlZXRYUgG8lz_ZgGkYYJ_GKhuf18youTmMU-FlG7z8,21
+apprise/plugins/NotifyBoxcar.py,sha256=vR00-WggHa1nHYWyb-f5P2V-G4f683fU_-GBlIeJvD0,12867
+apprise/plugins/NotifyBulkSMS.py,sha256=stPWAFCfhBP617zYK9Dgk6pNJBN_WcyJtODzo0jR1QQ,16005
+apprise/plugins/NotifyBulkVS.py,sha256=viLGeyUDiirRRM7CgRqqElHSLYFnMugDtWE6Ytjqfaw,13290
+apprise/plugins/NotifyBurstSMS.py,sha256=cN2kRETKIK5LhwpQEA8C68LKv8KEUPmXYe-nTSegGls,15550
+apprise/plugins/NotifyChantify.py,sha256=GJJOAtSnVoIfKbJF_W1DTu7WsvS_zHdjO4T1XTKT87g,6673
+apprise/plugins/NotifyClickSend.py,sha256=UfOJqsas6WLjQskojuJE7I_-lrb5QrkMiBZv-po_Q9c,11229
+apprise/plugins/NotifyD7Networks.py,sha256=4E6Fh0kQoDlMMwgZJDOXky7c7KrdMMvqprcfm29scWU,15043
+apprise/plugins/NotifyDBus.py,sha256=1eVJHIL3XkFjDePMqfcll35Ie1vxggJ1iBsVFAIaF00,14379
+apprise/plugins/NotifyDapnet.py,sha256=KuXjBU0ZrIYtoDei85NeLZ-IP810T4w5oFXH9sWiSh0,13624
+apprise/plugins/NotifyDingTalk.py,sha256=NJyETgN6QjtRqtxQjfBLFVuFpURyWykRftm6WpQJVbY,12009
+apprise/plugins/NotifyDiscord.py,sha256=M_qmTzB7NNL5_agjYDX38KBN1jRzDBp2EMSNwEF_9Tw,26072
+apprise/plugins/NotifyEmail.py,sha256=Y_ZOrdK6hTUKHLvogKpV5VqD8byzDyDSvwIVmfdsC2g,39789
+apprise/plugins/NotifyEmby.py,sha256=OMVO8XsVl_XCBYNNNQi8ni2lS4voLfU8Puk1xJOAvHs,24039
+apprise/plugins/NotifyEnigma2.py,sha256=Hj0Q9YOeljSwbfiuMKLqXTVX_1g_mjNUGEts7wfrwno,11498
+apprise/plugins/NotifyFCM/__init__.py,sha256=mBFtIgIJuLIFnMB5ndx5Makjs9orVMc2oLoD7LaVT48,21669
+apprise/plugins/NotifyFCM/color.py,sha256=8iqDtadloQh2TMxkFmIFwenHqKp1pHHn1bwyWOzZ6TY,4592
+apprise/plugins/NotifyFCM/common.py,sha256=978uBUoNdtopCtylipGiKQdsQ8FTONxkFBp7uJMZHc8,1718
+apprise/plugins/NotifyFCM/oauth.py,sha256=Vvbd0-rd5BPIjAneG3rILU153JIzfSZ0kaDov6hm96M,11197
+apprise/plugins/NotifyFCM/priority.py,sha256=0WuRW1y1HVnybgjlTeCZPHzt7j8SwWnC7faNcjioAOc,8163
+apprise/plugins/NotifyFeishu.py,sha256=IpcABdLZJ1vcQdZHlmASVbNOiOCIrmgKFhz1hbdskY4,7266
+apprise/plugins/NotifyFlock.py,sha256=0rUIa9nToGsO8BTUgixh8Z_qdVixJeH479UNYjcE4EM,12748
+apprise/plugins/NotifyForm.py,sha256=38nL-2m1cf4gEQFQ4NpvA4j9i5_nNUgelReWFSjyV5U,17905
+apprise/plugins/NotifyFreeMobile.py,sha256=XCkgZLc3KKGlx_9UdeoMJVcHpeQrOml9T93S-DGf4bs,6644
+apprise/plugins/NotifyGnome.py,sha256=8MXTa8gZg1wTgNJfLlmq7_fl3WaYK-SX6VR91u308C4,9059
+apprise/plugins/NotifyGoogleChat.py,sha256=lnoN17m6lZANaXcElDTP8lcuVWjIZEK8C6_iqJNAnw4,12622
+apprise/plugins/NotifyGotify.py,sha256=DNlOIHyuYitO5use9oa_REPm2Fant7y9QSaatrZFNI0,10551
+apprise/plugins/NotifyGrowl.py,sha256=M6ViUz967VhEHtXrE7lbCKF3aB4pIXNEzJLjjGAmvhM,14023
+apprise/plugins/NotifyGuilded.py,sha256=eCMCoFFuE0XNY8HlLM21zoxgBNgqEKQ8dwYj8LihfRU,3641
+apprise/plugins/NotifyHomeAssistant.py,sha256=zqWu7TtdXhTbGNuflC8WfydbHsCLiEBw4uBUcF7YZtw,10739
+apprise/plugins/NotifyHttpSMS.py,sha256=pDEUHCCB18IhOgDcVK3_FFDJdAcrdTIfPzj0jNnZZBo,11136
+apprise/plugins/NotifyIFTTT.py,sha256=oMvTQ0bEu2eJQgw9BwxAwTNOtbZ_ER-zleJvWpWTj7w,13425
+apprise/plugins/NotifyJSON.py,sha256=70ctjmArGzuvM1gHNt1bCiQVWE7Fp9vd2nWhSXwFvw0,13851
+apprise/plugins/NotifyJoin.py,sha256=B8FHp7cblZBkxTgfrka6mNnf6oQVBXVuGISgSau00z0,13581
+apprise/plugins/NotifyKavenegar.py,sha256=F5xTUdebM1lK6yGFbZJQB9Zgw2LTI0angeA-3Nu-89w,12620
+apprise/plugins/NotifyKumulos.py,sha256=eCEW2ZverZqETOLHVWMC4E8Ll6rEhhEWOSD73RD80SM,8214
+apprise/plugins/NotifyLametric.py,sha256=h8vZoX-Ll5NBZRprBlxTO2H9w0lOiMxglGvUgJtK4_8,37534
+apprise/plugins/NotifyLine.py,sha256=OVI0ozMJcq_-dI8dodVX52dzUzgENlAbOik-Kw4l-rI,10676
+apprise/plugins/NotifyLunaSea.py,sha256=woN8XdkwAjhgxAXp7Zj4XsWLybNL80l4W3Dx5BvobZg,14459
+apprise/plugins/NotifyMQTT.py,sha256=cnuG4f3bYYNPhEj9qDX8SLmnxLVT9G1b8J5w6-mQGKY,19545
+apprise/plugins/NotifyMSG91.py,sha256=P7JPyT1xmucnaEeCZPf_6aJfe1gS_STYYwEM7hJ7QBw,12677
+apprise/plugins/NotifyMSTeams.py,sha256=dFH575hoLL3zRddbBKfozlYjxvPJGbj3BKvfJSIkvD0,22976
+apprise/plugins/NotifyMacOSX.py,sha256=y2fGpSZXomFiNwKbWImrXQUMVM4JR4uPCnsWpnxQrFA,8271
+apprise/plugins/NotifyMailgun.py,sha256=FNS_QLOQWMo62yVO-mMZkpiXudUtSdbHOjfSrLC4oIo,25409
+apprise/plugins/NotifyMastodon.py,sha256=2ovjQIOOITHH8lOinC8QCFCJN2QA8foIM2pjdknbblc,35277
+apprise/plugins/NotifyMatrix.py,sha256=I8kdaZUZS-drew0JExBbChQVe7Ib4EwAjQd0xE30XT0,50049
+apprise/plugins/NotifyMattermost.py,sha256=JgEc-wC-43FBMItezDJ62zv1Nc9ROFjDiwD_8bt8rgM,12722
+apprise/plugins/NotifyMessageBird.py,sha256=EUPwhs1PHiPZpluIrLiNKQMUPcdlKnx1sdnllCtN_Ns,12248
+apprise/plugins/NotifyMisskey.py,sha256=zYZkBKv0p3jJpm_HLDBugUgKeGb0qpLoPqy0ffwwxVg,9600
+apprise/plugins/NotifyNextcloud.py,sha256=M3EyvUzBMHbTKU3gxW_7fPA6vmQUF5x8GTMZQ78sWCA,12759
+apprise/plugins/NotifyNextcloudTalk.py,sha256=dLl_g7Knq5PVcadbzDuQsxbGHTZlC4r-pQC8wzYnmAo,11011
+apprise/plugins/NotifyNotica.py,sha256=yHmk8HiNFjzoI4Gewo_nBRrx9liEmhT95k1d10wqhYg,12990
+apprise/plugins/NotifyNotifiarr.py,sha256=ADwLJO9eenfLkNa09tXMGSBTM4c3zTY0SEePvyB8WYA,15857
+apprise/plugins/NotifyNotifico.py,sha256=Qe9jMN_M3GL4XlYIWkAf-w_Hf65g9Hde4bVuytGhUW4,12035
+apprise/plugins/NotifyNtfy.py,sha256=AtJt2zH35mMQTwRDxKia93NPy6-4rtixplP53zIYV2M,27979
+apprise/plugins/NotifyOffice365.py,sha256=8TxsVsdbUghmNj0kceMlmoZzTOKQTgn3priI8JuRuHE,25190
+apprise/plugins/NotifyOneSignal.py,sha256=gsw7ckW7xLiJDRUb7eJHNe_4bvdBXmt6_YsB1u_ghjw,18153
+apprise/plugins/NotifyOpsgenie.py,sha256=zJWpknjoHq35Iv9w88ucR62odaeIN3nrGFPtYnhDdjA,20515
+apprise/plugins/NotifyPagerDuty.py,sha256=lu6oNdygrs6UezYm6xgiQxQDeDz8EVUtfP-xsArRvyw,17874
+apprise/plugins/NotifyPagerTree.py,sha256=mPl6ejdelNlWUWGVs46kZT0VV4uFZoeCdcv4VJ_f_XQ,13849
+apprise/plugins/NotifyParsePlatform.py,sha256=6oFOTpu-HMhesaYXRBvu5oaESYlFrKBNYTHE-ItCBRk,10291
+apprise/plugins/NotifyPopcornNotify.py,sha256=kRstzG0tWBdxSRfn2RN2J7FhvIj2qYWlwUyLxxZCbPc,10587
+apprise/plugins/NotifyProwl.py,sha256=EGOdmiZq8CFbjxTtWWKLQEdYiSvr4czZfE_8aCMEokw,9782
+apprise/plugins/NotifyPushBullet.py,sha256=JVd2GQH-DWmPaKjuGBpsE6DXNCcZEUDH7tA5zbM1qEU,15372
+apprise/plugins/NotifyPushDeer.py,sha256=cG1UFG06PfzbmI1RxtrMqmfaHK_Ojk_W-QMEdtkEuUI,6922
+apprise/plugins/NotifyPushMe.py,sha256=ioRzeXbd2X5miTd3h3m7AwCqkIIfbXNm4PjYk0OOXZ0,7134
+apprise/plugins/NotifyPushSafer.py,sha256=hIcYHwUZapmC-VDvaO_UkDY9RSPTxHgF7m2FL-6JBZw,26756
+apprise/plugins/NotifyPushed.py,sha256=NqLMXD9gvihXLfLUtCcMfz5oUAhPM7sKXECqKgD0v-U,12270
+apprise/plugins/NotifyPushjet.py,sha256=8qWpIqM4dKWjO-BjOrRJXZYtvtJBt_mikdBWRxfibnE,8952
+apprise/plugins/NotifyPushover.py,sha256=MJDquV4zl1cNrGZOC55hLlt6lOb6625WeUcgS5ceCbk,21213
+apprise/plugins/NotifyPushy.py,sha256=mmWcnu905Fvc8ihYXvZ7lVYErGZH5Q-GbBNS20v5r48,12496
+apprise/plugins/NotifyRSyslog.py,sha256=W42LT90X65-pNoU7KdhdX1PBcmsz9RyV376CDa_H3CI,11982
+apprise/plugins/NotifyReddit.py,sha256=E78OSyDQfUalBEcg71sdMsNBOwdj7cVBnELrhrZEAXY,25785
+apprise/plugins/NotifyRevolt.py,sha256=DRA9Xylwl6leVjVFuJcP4L1cG49CIBtnQdxh4BKnAZ4,14500
+apprise/plugins/NotifyRocketChat.py,sha256=Cb_nasX0-G3FoPMYvNk55RJ-tHuXUCTLUn2wTSi4IcI,25738
+apprise/plugins/NotifyRyver.py,sha256=yhHPMLGeJtcHwBKSPPk0OBfp59DgTvXio1R59JhrJu4,11823
+apprise/plugins/NotifySES.py,sha256=wtRmpAZkS5mQma6sdiaPT6U1xcgoj77CB9mNFvSEAw8,33545
+apprise/plugins/NotifySMSEagle.py,sha256=voFNqOewD9OC1eRctD0YdUB_ZSWsb06rjUwBfCcxPYA,24161
+apprise/plugins/NotifySMSManager.py,sha256=DbVc35qLfYkNL7eq43_rPD6k-PELL9apf3S09S6qvDA,14125
+apprise/plugins/NotifySMTP2Go.py,sha256=foQ7aMMmNc5Oree8YwrxZJgMnF6yVMFAfqShm_nLbx0,19711
+apprise/plugins/NotifySNS.py,sha256=ZEBWf0ZJ9w_ftzUikKEvQWJ2fkxrUbrLhPmTRD2DvRQ,24159
+apprise/plugins/NotifySendGrid.py,sha256=IBdYmZcthkvGCz1N_Fs8vDnImtHug6LpuKv1mWT_Cdo,16213
+apprise/plugins/NotifyServerChan.py,sha256=WsrClO9f0xi-KpnLZGTUHV7PxeU3l1D875gvMaZRG_M,5779
+apprise/plugins/NotifySignalAPI.py,sha256=OwJ7qjJ-ZJyS8GS-dBWAtgizHMnGegg76GuwFobyWkw,16733
+apprise/plugins/NotifySimplePush.py,sha256=dUC6O8IGuUIAz5z6_H7A7jdv5Gj1plytNm5QyKnHAYg,10876
+apprise/plugins/NotifySinch.py,sha256=tmHLwQa9lWHEI3EcRfigl4i7JU46A6gKAi_GbY0PrX4,16813
+apprise/plugins/NotifySlack.py,sha256=3VdjruU5FPr3jT_s3axwRJKMcBYXP0lvJnyuKedIlcE,42521
+apprise/plugins/NotifySparkPost.py,sha256=6dRTwnYU50Lvmp6AlwCyePe0TMbVEXaSwNeGkg__EYo,27878
+apprise/plugins/NotifyStreamlabs.py,sha256=lx3N8T2ufUWFYIZ-kU_rOv50YyGWBqLSCKk7xim2_Io,16023
+apprise/plugins/NotifySynology.py,sha256=_jTqfgWeOuSi_I8geMOraHBVFtDkvm9mempzymrmeAo,11105
+apprise/plugins/NotifySyslog.py,sha256=J9Kain2bb-PDNiG5Ydb0q678cYjNE_NjZFqMG9oEXM0,10617
+apprise/plugins/NotifyTechulusPush.py,sha256=m43_Qj1scPcgCRX5Dr2Ul7nxMbaiVxNzm_HRuNmfgoA,7253
+apprise/plugins/NotifyTelegram.py,sha256=XE7PC9LRzcrfE2bpLKyor5lO_7B9LS4Xw1UlUmA4a2A,37187
+apprise/plugins/NotifyThreema.py,sha256=C_C3j0fJWgeF2uB7ceJFXOdC6Lt0TFBInFMs5Xlg04M,11885
+apprise/plugins/NotifyTwilio.py,sha256=WCo8eTI9OF1rtg3ueHHRDXt4Lp45eZ6h3IdTZVf5HM8,15976
+apprise/plugins/NotifyTwist.py,sha256=nZA73CYVe-p0tkVMy5q3vFRyflLM4yjUo9LECvkUwgc,28841
+apprise/plugins/NotifyTwitter.py,sha256=qML0jlBkLZMHrkKRxBpVUnBwAz8MWGYyI3cvwi-hrgM,30152
+apprise/plugins/NotifyVoipms.py,sha256=msy_D32YhP8OP4_Mj_L3OYd4iablqQETN-DvilGZeVQ,12552
+apprise/plugins/NotifyVonage.py,sha256=xmzZgobFaGA_whpQ5fDuG2poUrK9W4T77yP7dusHcSo,13431
+apprise/plugins/NotifyWeComBot.py,sha256=5lkhXDgyJ1edzknemKsO1sJVv7miR9F_7xI40Ag7ICI,8789
+apprise/plugins/NotifyWebexTeams.py,sha256=gbbRlHiPuOvUIZexE5m2QNd1dN_5_x0OdT5m6NSrcso,9164
+apprise/plugins/NotifyWhatsApp.py,sha256=PtzW0ue3d2wZ8Pva_LG29jUcpRRP03TFxO5SME_8Juo,19924
+apprise/plugins/NotifyWindows.py,sha256=QgWJfJF8AE6RWr-L81YYVZNWrnImK9Qr3B991HWanqU,8563
+apprise/plugins/NotifyXBMC.py,sha256=5hDuOTP3Kwtp4NEMaokNjWyEKEkQcN_fSx-cUPJvhaU,12096
+apprise/plugins/NotifyXML.py,sha256=WJnmdvXseuTRgioVMRqpR8a09cDfTpPTfuFlTnT_TfI,16973
+apprise/plugins/NotifyZulip.py,sha256=M8cSL7nZvtBYyTX6045g34tyn2vyybltgD1CoI4Xa7A,13968
+apprise/plugins/__init__.py,sha256=jTfLmW47kZC_Wf5eFFta2NoD2J-7_E7JaPrrVMIECkU,18725
+apprise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+apprise/utils.py,sha256=SjRU2tb1UsVnTCTXPUyXVz3WpRbDWwAHH-d3ll38EHY,53185
diff --git a/libs/apprise-1.8.0.dist-info/REQUESTED b/libs/apprise-1.7.6.dist-info/REQUESTED
index e69de29bb..e69de29bb 100644
--- a/libs/apprise-1.8.0.dist-info/REQUESTED
+++ b/libs/apprise-1.7.6.dist-info/REQUESTED
diff --git a/libs/apprise-1.8.0.dist-info/WHEEL b/libs/apprise-1.7.6.dist-info/WHEEL
index ba48cbcf9..ba48cbcf9 100644
--- a/libs/apprise-1.8.0.dist-info/WHEEL
+++ b/libs/apprise-1.7.6.dist-info/WHEEL
diff --git a/libs/apprise-1.8.0.dist-info/entry_points.txt b/libs/apprise-1.7.6.dist-info/entry_points.txt
index 7f20ac9a3..7f20ac9a3 100644
--- a/libs/apprise-1.8.0.dist-info/entry_points.txt
+++ b/libs/apprise-1.7.6.dist-info/entry_points.txt
diff --git a/libs/apprise-1.8.0.dist-info/top_level.txt b/libs/apprise-1.7.6.dist-info/top_level.txt
index 9f8c12a76..9f8c12a76 100644
--- a/libs/apprise-1.8.0.dist-info/top_level.txt
+++ b/libs/apprise-1.7.6.dist-info/top_level.txt
diff --git a/libs/apprise-1.8.0.dist-info/RECORD b/libs/apprise-1.8.0.dist-info/RECORD
deleted file mode 100644
index bcfa733bc..000000000
--- a/libs/apprise-1.8.0.dist-info/RECORD
+++ /dev/null
@@ -1,183 +0,0 @@
-../../bin/apprise,sha256=ZJ-e4qqxNLtdW_DAvpuPPX5iROIiQd8I6nvg7vtAv-g,233
-apprise-1.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-apprise-1.8.0.dist-info/LICENSE,sha256=gt7qKBxRhVcdmXCYVtrWP6DtYjD0DzONet600dkU994,1343
-apprise-1.8.0.dist-info/METADATA,sha256=if2D6aZrIVQZAe9BKWyqKoKH89ZGnYOTvXGRfqcSf_g,44823
-apprise-1.8.0.dist-info/RECORD,,
-apprise-1.8.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-apprise-1.8.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
-apprise-1.8.0.dist-info/entry_points.txt,sha256=71YypBuNdjAKiaLsiMG40HEfLHxkU4Mi7o_S0s0d8wI,45
-apprise-1.8.0.dist-info/top_level.txt,sha256=JrCRn-_rXw5LMKXkIgMSE4E0t1Ks9TYrBH54Pflwjkk,8
-apprise/__init__.py,sha256=nBy2lkwvLxW1QTMEagOZZnM5AQWLM6CRUYt-Gr03X94,3388
-apprise/apprise.py,sha256=JWSqg5pYJOydubQyaIjR9gIPhb2okcrGe2mQ_NhPNS0,32837
-apprise/apprise.pyi,sha256=_4TBKvT-QVj3s6PuTh3YX-BbQMeJTdBGdVpubLMY4_k,2203
-apprise/apprise_attachment.py,sha256=eYVnNWTWQzlzKPDOgMCzGvVtXXDL6noMwtRKwwvyL8Q,12528
-apprise/apprise_attachment.pyi,sha256=R9-0dVqWpeaFrVpcREwPhGy3qHWztG5jEjYIOsbE5dM,1145
-apprise/apprise_config.py,sha256=qlNtd-OkldrY9rE9vT67fVPHINx9fkkbwQinhbBjQ_I,16896
-apprise/apprise_config.pyi,sha256=_mUlCnncqAq8sL01WxQTgZjnb2ic9kZXvtqZmVl-fc8,1568
-apprise/asset.py,sha256=ICXIjCi12Xq8E-WIR4mrVC7KcpPRiJDlKG8cHqoCll0,11643
-apprise/asset.pyi,sha256=NYLXXYbScgRkspP27XGpRRM_uliPu1OCdWdZBPPvLng,979
-apprise/assets/NotifyXML-1.0.xsd,sha256=292qQ_IUl5EWDhPyzm9UTT0C2rVvJkyGar8jiODkJs8,986
-apprise/assets/NotifyXML-1.1.xsd,sha256=bjR3CGG4AEXoJjYkGCbDttKHSkPP1FlIWO02E7G59g4,1758
-apprise/assets/themes/default/apprise-failure-128x128.ico,sha256=Mt0ptfHJaN3Wsv5UCNDn9_3lyEDHxVDv1JdaDEI_xCA,67646
-apprise/assets/themes/default/apprise-failure-128x128.png,sha256=66ps8TDPxVH3g9PlObJqF-0x952CjnqQyN3zvpRcOT8,16135
-apprise/assets/themes/default/apprise-failure-256x256.png,sha256=bQBsKKCsKfR9EqgYOZrcVcVa5y8qG58PN2mEqO5eNRI,41931
-apprise/assets/themes/default/apprise-failure-32x32.png,sha256=vH0pZffIDCvkejpr3fJHGXW__8Yc3R_p0bacX6t6l18,2437
-apprise/assets/themes/default/apprise-failure-72x72.png,sha256=EP5A8DHRDr9srgupFSwOoyQ308bNJ8aL192J_L4K-ec,7600
-apprise/assets/themes/default/apprise-info-128x128.ico,sha256=F5_CirmXueRCRI5Z_Crf6TS6jVIXTJlRD83zw1oJ66g,67646
-apprise/assets/themes/default/apprise-info-128x128.png,sha256=bBqRZAgQey-gkmJrnFhPbzjILSrljE59mRkgj3raMQo,16671
-apprise/assets/themes/default/apprise-info-256x256.png,sha256=B5r_O4d9MHCmSWZwfbqQgZSp-ZetTdiBSwKcMTF1aFA,43331
-apprise/assets/themes/default/apprise-info-32x32.png,sha256=lt3NZ95TzkiCNVNlurrB2fE2nriMa1wftl7nrNXmb6c,2485
-apprise/assets/themes/default/apprise-info-72x72.png,sha256=kDnsZpqNUZGqs9t1ECUup7FOfXUIL-rupnQCYJp9So4,7875
-apprise/assets/themes/default/apprise-logo.png,sha256=85ttALudKkLmiqilJT7mUQLUXRFmM1AK89rnwLm313s,160907
-apprise/assets/themes/default/apprise-success-128x128.ico,sha256=uCopPwdQjxgfohKazHaDzYs9y4oiaOpL048PYC6WRlg,67646
-apprise/assets/themes/default/apprise-success-128x128.png,sha256=nvDuU_QqhGlw6cMtdj7Mv-gPgqCEx-0DaaXn1KBLVYg,17446
-apprise/assets/themes/default/apprise-success-256x256.png,sha256=vXfKuxY3n0eeXHKdb9hTxICxOEn7HjAQ4IZpX0HSLzc,48729
-apprise/assets/themes/default/apprise-success-32x32.png,sha256=Jg9pFJh3YPI-LiPBebyJ7Z4Vt7BRecaE8AsRjQVIkME,2471
-apprise/assets/themes/default/apprise-success-72x72.png,sha256=FQbgvIhqKOhEK0yvrhaSpai0R7hrkTt_-GaC2KUgCCk,7858
-apprise/assets/themes/default/apprise-warning-128x128.ico,sha256=6XaQPOx0oWK_xbhr4Yhb7qNazCWwSs9lk2SYR2MHTrQ,67646
-apprise/assets/themes/default/apprise-warning-128x128.png,sha256=pf5c4Ph7jWH7gf39dJoieSj8TzAsY3TXI-sGISGVIW4,16784
-apprise/assets/themes/default/apprise-warning-256x256.png,sha256=SY-xlaiXaj420iEYKC2_fJxU-yj2SuaQg6xfPNi83bw,43708
-apprise/assets/themes/default/apprise-warning-32x32.png,sha256=97R2ywNvcwczhBoWEIgajVtWjgT8fLs4FCCz4wu0dwc,2472
-apprise/assets/themes/default/apprise-warning-72x72.png,sha256=L8moEInkO_OLxoOcuvN7rmrGZo64iJeH20o-24MQghE,7913
-apprise/attachment/__init__.py,sha256=9jSiGEbLllS-0Vbpgxo4MCpZfIJ-saezWWgQ1PofZ9I,1678
-apprise/attachment/base.py,sha256=phcM6C281j2eoEhtoH5FY0m5s_JvWiEm1AK9z9gyi0w,13692
-apprise/attachment/base.pyi,sha256=w0XG_QKauiMLJ7eQ4S57IiLIURZHm_Snw7l6-ih9GP8,961
-apprise/attachment/file.py,sha256=d9gpsunNIot-6h6w-WQmwWgFiCv7YLqk42zJr4LLqE4,4752
-apprise/attachment/http.py,sha256=C0L9zKmHi60wyzEZN-OJCF7LVoY-MMHYMqhXspFlLdU,13748
-apprise/cli.py,sha256=h-pWSQPqQficH6J-OEp3MTGydWyt6vMYnDZvHCeAt4Y,20697
-apprise/common.py,sha256=I6wfrndggCL7l7KAl7Cm4uwAX9n0l3SN4-BVvTE0L0M,5593
-apprise/common.pyi,sha256=luF3QRiClDCk8Z23rI6FCGYsVmodOt_JYfYyzGogdNM,447
-apprise/config/__init__.py,sha256=oDxdoqG2NEYu_bbpLsLaM3L9WKY3gNn5gjIwb2h3LU4,1679
-apprise/config/base.py,sha256=iWgrBk4-wm_SHtNbe7dCQOYnbkI3oKWP_b60qwjGSoU,53173
-apprise/config/base.pyi,sha256=cngfobwH6v2vxYbQrObDi5Z-t5wcquWF-wR0kBCr3Eg,54
-apprise/config/file.py,sha256=MB_H2X5lJZS-XAOahkMb3IsD2rgVebFjiEF76goITEg,6125
-apprise/config/http.py,sha256=CjQtv_OQJykMxD4ssiwbFI3P8CeQiPdYV_ZIiL_XqMw,9440
-apprise/config/memory.py,sha256=8VICU-WLux8KnW6i9sf9fgmns90J-MfVYI3pvTiyTno,2816
-apprise/conversion.py,sha256=fSn-pTE6-vNt9qVQCKib_NTMhZnCH88FoMt14x6co1M,6273
-apprise/decorators/__init__.py,sha256=e_PDAm0kQNzwDPx-NJZLPfLMd2VAABvNZtxx_iDviRM,1487
-apprise/decorators/base.py,sha256=KnRzhrTOxQxwm4KuJxfCfaYfX0MrFbqWTvXY1XuiNck,8019
-apprise/decorators/notify.py,sha256=FzIa7m-G5KnVVa__rjyn990zt2lqE8sdHW-XY79lbAU,5097
-apprise/emojis.py,sha256=ONF0t8dY9f2XlEkLUG79-ybKVAj2GqbPj2-Be97vAoI,87738
-apprise/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-apprise/i18n/en/LC_MESSAGES/apprise.mo,sha256=w-KW6RXYYMr14raaIvJzbop8tXU4qrsz50zm8rcCo3U,3959
-apprise/locale.py,sha256=4uSr4Nj_rz6ISMMAfRVRk58wZVLKOofJgk2x0_E8NkQ,8994
-apprise/logger.py,sha256=131hqhed8cUj9x_mfXDEvwA2YbcYDFAYiWVK1HgxRVY,6921
-apprise/manager.py,sha256=_LiMG1Upk6h6GcxOw3GjsPtVT8ZJLhLlQkC_xL_dm6A,27218
-apprise/manager_attachment.py,sha256=EkrcKtKjbxTXXyDaKyiu4XSfDu9wKFSdJD7TOTpyOUc,2200
-apprise/manager_config.py,sha256=sCIOlBTH13bQ1cuhQVpUq2vyKWBArA8YRyPnXIB1iWQ,2205
-apprise/manager_plugins.py,sha256=Xbg5-xr-06zMIDoWviz-zKcbzusHj0iBBMchKPpUOkg,2211
-apprise/plugins/__init__.py,sha256=Hm-vt-Xtxir5mgOdehqlGLhIlc45LA31zjqV42uRnB8,18701
-apprise/plugins/apprise_api.py,sha256=D93eUOlEQ1xPZYdagnEtIxkSuzZ4b9XreuhntQW97F8,16638
-apprise/plugins/aprs.py,sha256=fyzhdsESVwsqHMbfjnlRuGuAqAz2Pk_-MrmiMihs8qY,25506
-apprise/plugins/bark.py,sha256=oSz7Nr7vxnXxqA5dRaO6ze2IljkgEQavUPs-MUUDSX4,15681
-apprise/plugins/base.py,sha256=720L5OyMMLqlM3UdYSNMpA3m0rCudzGP3HwKgu73Ons,30350
-apprise/plugins/base.pyi,sha256=aKlZXRYUgG8lz_ZgGkYYJ_GKhuf18youTmMU-FlG7z8,21
-apprise/plugins/boxcar.py,sha256=8ImhsSsOK9o3eiYp4dZ6fO6p6AeI-jOPWoFJ8qvRAxY,12850
-apprise/plugins/bulksms.py,sha256=XuP8X4dL1wWQU7TkLYWPWRAro7TymnF7PlF2ESe7o0o,15988
-apprise/plugins/bulkvs.py,sha256=sLpiKbHs63Yu0UjMc9erW1VSgLceuu5wvPie5iyl03k,13273
-apprise/plugins/burstsms.py,sha256=7YmuhElVvT-0FIxMFBILHjo6Fir0J4qHTuqj8KfWBaI,15533
-apprise/plugins/chantify.py,sha256=hOvrmhH051Us28_kv0mKkuaJ2BN_8pSsslF8eMCgp-Q,6660
-apprise/plugins/clicksend.py,sha256=kKUJgk9FcTcfXqcIV57uMz0VxBtSQqkpxocRkgn0-3Q,11408
-apprise/plugins/custom_form.py,sha256=fMYwSQyEa_u8IEw5QSylDn-y32FnmymkL5ng-tGxDoc,17888
-apprise/plugins/custom_json.py,sha256=UCXaegE1nD8UrKlFrSKQbxfbcrX1BHUvZwBZY6a_aJc,13834
-apprise/plugins/custom_xml.py,sha256=lrPCRngPz8_oV2A8ZfiIY56BRQc1iv0PN0--2LOlxpA,16956
-apprise/plugins/d7networks.py,sha256=2o_wDgoak_S0sUJJa7HPtu0PPKLVmIOrq1rV9llOnHY,15030
-apprise/plugins/dapnet.py,sha256=fclGE69ggMejgpyvBpJqTwFNF3g2w7qpFySOMcc9vi0,13607
-apprise/plugins/dbus.py,sha256=lvHLmOkJYJAr4TjrigdIgP5bBlQXHrNCDR0k80LNsks,14366
-apprise/plugins/dingtalk.py,sha256=1twAGYUZzjhQepg2zhaR7u8QJuWvM5WymkbPQSUKBck,11992
-apprise/plugins/discord.py,sha256=kdR09bKU80-AosBIrTkMSxoOkAUHMXKwSr1P3H-M_f4,26053
-apprise/plugins/email.py,sha256=pVVWhEpT9Zi7qyUvpI2UxbjxkXYe6FoJj8E0NTw4P98,39912
-apprise/plugins/emby.py,sha256=HWYxlgHE99yAPKii4IE1XQQ-B1HViklWOkefjmq6SW4,24022
-apprise/plugins/enigma2.py,sha256=40Uo0m1JtLUcwRnfqKqdX_8ZR1-SvPfJ5470uijgdfw,11481
-apprise/plugins/fcm/__init__.py,sha256=eTjX-ahPHrPddX0v_Ix77qEr2G4NQ7reClCMzX3Nxwk,21657
-apprise/plugins/fcm/color.py,sha256=rQxVRL_CcRlgnNTQXkjB1Bfs0Xc933zOB1tURSdhi7Y,4585
-apprise/plugins/fcm/common.py,sha256=978uBUoNdtopCtylipGiKQdsQ8FTONxkFBp7uJMZHc8,1718
-apprise/plugins/fcm/oauth.py,sha256=Vvbd0-rd5BPIjAneG3rILU153JIzfSZ0kaDov6hm96M,11197
-apprise/plugins/fcm/priority.py,sha256=0WuRW1y1HVnybgjlTeCZPHzt7j8SwWnC7faNcjioAOc,8163
-apprise/plugins/feishu.py,sha256=buGBg1YlcwHjwUGzUfju4cdYbmEOFl3EHU_NzEBqtlM,7253
-apprise/plugins/flock.py,sha256=_bhH-ub0LbuU7k2p1ZwUPZ-TbC3kpD48GKNtLebUpoM,12735
-apprise/plugins/freemobile.py,sha256=NZf553UWkl1FVEVyWQKJN3ZD6opYSv3I-L6DRaKbiCw,6679
-apprise/plugins/gnome.py,sha256=UYtaiMKxILhTdsxe4aeLaJwjV6Af-8VhjVR3W3CyPPk,9046
-apprise/plugins/google_chat.py,sha256=f7F4gPxwwkmhDBlXMHzYoHRhPX3w8tyD7OimGBjmNxg,12609
-apprise/plugins/gotify.py,sha256=ISzmuQ4-Wd46OlaxGSAZBbWDTq9mHBUYO0R-7tAX_zc,10538
-apprise/plugins/growl.py,sha256=mlpN1QXGlEf2BA3BORnvkyT0oiTsWBev2y5gzpOm9r0,14006
-apprise/plugins/guilded.py,sha256=lhE6gK7laQNYEubD9lBGRemFK-IHis_u2tNekbUoGgM,3707
-apprise/plugins/home_assistant.py,sha256=Wstut0QaQL2dE66kH8MOqMANayhvGOq7CuxVz9O-T60,10722
-apprise/plugins/httpsms.py,sha256=2TtIlAFa4cjXwpMyrjfieCFHgaZl4H_YT6IoPIMDOcg,11123
-apprise/plugins/ifttt.py,sha256=ZHtu7pW9I0aHVEC4DshKi6XZCwqQ0A_XGLyFJujwdKY,13412
-apprise/plugins/join.py,sha256=mRop7thH24kQmvIEvtnh0HT0VyBrUXm2sS-P69c0iFE,13568
-apprise/plugins/kavenegar.py,sha256=1vdms7QBaLcTiLXeQGfprMU5rw9wgImRLtALIb78-ro,12607
-apprise/plugins/kumulos.py,sha256=6M_way1Qi5bELm8Csay86AVtVhzmRyv5hfxGrFvyzN4,8201
-apprise/plugins/lametric.py,sha256=JR0XjdxkEphT4VKvKfElNxpAoOpXZCb-40b2SJQP9XA,37521
-apprise/plugins/line.py,sha256=-xONdu4LFkS3sGgZeEGiPGbBIvBEd20lCbyxKLhQwAg,10659
-apprise/plugins/lunasea.py,sha256=WxJ-RIbFDiS1-5HjCs8XVdNv7nt2EHimsXGCDaK0sC0,14442
-apprise/plugins/macosx.py,sha256=4vIXz1xlsq_xlEyeu_rEvzJQZYcWq7pVmSn5VjF_dCY,8258
-apprise/plugins/mailgun.py,sha256=ad3jzdrbdgwWmOAAu4e_inLEAo-cii4z0OnIJQXoSIA,25396
-apprise/plugins/mastodon.py,sha256=X8CBxnuWORLo9JEOLCJcSafFNVrcEd778R38doyNWUo,35254
-apprise/plugins/matrix.py,sha256=zJPTLFqRT6mofXFVi421_poF0Qm7KaWSgNXTBKq3YoI,50032
-apprise/plugins/mattermost.py,sha256=KfHfqt3LO4XuMsY-qNV-i_OAAamF-35RgjHzxuq2deM,12709
-apprise/plugins/messagebird.py,sha256=3TJ_31Vc1liwQKKKwEiO_rP5e4jP4QkcU_wHyRGtf5Q,12235
-apprise/plugins/misskey.py,sha256=E5UrDrVryb7zV2D_qJCPsCyvpynF4-22JqRVco6PcgM,9587
-apprise/plugins/mqtt.py,sha256=3LcRhT44o2QoSH5rJs23xRbi2vob-po5FAPnnEU_cgs,19528
-apprise/plugins/msg91.py,sha256=V3PwdCS5r-LbVHNNTFZGUHt7GPwQOHnQC0mx8G90wGQ,12664
-apprise/plugins/msteams.py,sha256=4maXBIQFEVfH-IVzZW6t4jirsozmKwF4ySPP5h20cTQ,22964
-apprise/plugins/nextcloud.py,sha256=iYmKGH-xZ4Kj3HvXA_krQody7LRqJKzMRu39Ivk1ve4,12742
-apprise/plugins/nextcloudtalk.py,sha256=TTK8qhy0VPjG0N1yFUBJWTieV-1DqT9Jux9D5PRiYAE,10994
-apprise/plugins/notica.py,sha256=MzryA8x-dSt-oRk9g3dlTTrb1ul7mnbRNajbiwTx1Mc,12973
-apprise/plugins/notifiarr.py,sha256=ZI2mjXwKLWx7SXb6d3S-sk2JmCswJ23UTPj9jVNSN0U,15844
-apprise/plugins/notifico.py,sha256=IKkiXU8HdbRnEWzkQKPFo1g-ZnT8AIwFYer7jF2Yjac,12022
-apprise/plugins/ntfy.py,sha256=jOmPZETJByyNmYSzr-2F3k5jAXFVNldcd3wK-tQRpyE,27956
-apprise/plugins/office365.py,sha256=bCg53GDruS7A3_PQNCjiSERhfub_FHTOVCsRwjgbjXU,25173
-apprise/plugins/one_signal.py,sha256=0ljKuz6Wyn5K8Rxp3BT8aARzHWYff0q2TWA5f-ZLJSA,18140
-apprise/plugins/opsgenie.py,sha256=wWUREzEn8FDQmmVGhmTlN7kxsYlzNj1tK3wA5t8UbCA,20502
-apprise/plugins/pagerduty.py,sha256=1vQ2rfbDUKnM0XdkVMrvTnWIPK7lTxrm-Nslt3LW5Ng,17857
-apprise/plugins/pagertree.py,sha256=uhZL2SxIJr0cguMGhJP_RIJxJZLd86uoAcMhHsBOKm8,13836
-apprise/plugins/parseplatform.py,sha256=G99l6AnHZtaw11y7oBBVVvgdg7lSM8gWFm4tAWhJ8d4,10278
-apprise/plugins/popcorn_notify.py,sha256=ppOqxPrZrOPa-TFicO3Lo_jgwOOPCNEXMgmEo10DAZA,10574
-apprise/plugins/prowl.py,sha256=fYsv6s8xA6OC0yFajgLf3jgL6IwiaOTZaJKisW4eNyw,9769
-apprise/plugins/pushbullet.py,sha256=g-7_Y0N4x-a8YE2gqDqW5OIi74YY7rja_jQ8WVKc4FI,15353
-apprise/plugins/pushdeer.py,sha256=8StOcyK1jlx3pc_CnmFUSqdjfvuv0qa6bf--FHP2_KE,6909
-apprise/plugins/pushed.py,sha256=pm3T7JGExjYeqVWQVN8J8JHkn1XBMfix_sdmr1ItXY8,12253
-apprise/plugins/pushjet.py,sha256=Xk0hzx6l5bNHtGgL0M_znRY5JRPUJf4_PhleCyFbe0I,8935
-apprise/plugins/pushme.py,sha256=EswSmup0uL3QmANeJPDhDYyyeBwSrTnqdjMlfvWFnFA,7121
-apprise/plugins/pushover.py,sha256=I6u9C1SVAEVnsLUySFq5UyHi4cQQtew5za4r86aTK10,21194
-apprise/plugins/pushsafer.py,sha256=aGQ1ibggAWGpcBwpD4oQQYMUcKVcV_xsTlc5_wdjssY,26743
-apprise/plugins/pushy.py,sha256=Ai1tKhcus5IuwvhQgtaj--RMPahgtpleWrBbr_ZQJfM,12483
-apprise/plugins/reddit.py,sha256=z54HpGeJxkyS_LH38nqPa6rqW8mrJqSEGTNOh4Cf-78,25768
-apprise/plugins/revolt.py,sha256=kVrJvTb7mBFXFZd9GIVrX2jVIvaUc5D5via48nOXNSA,14487
-apprise/plugins/rocketchat.py,sha256=oSaFzQ7XjOzjhPIPhdS7r_LGa1IJXV6VK_3xNH9Gq9M,25721
-apprise/plugins/rsyslog.py,sha256=9NTg4sYNbbAzw_MnN51YKxVQpb2o6WZUMyKpRtgoupM,11969
-apprise/plugins/ryver.py,sha256=OM_AG-oiRnNYIua-70Wp8lUpZzIkZ7erIiDE6Fd4Q6s,11810
-apprise/plugins/sendgrid.py,sha256=PGSdbkhERhFSZZN2j7km6mdojdlo7sFxs28lmOeDpgQ,16200
-apprise/plugins/serverchan.py,sha256=fcnuindQTPaKZ5gbS-nAxvL31YqkEF-vi4w8g_h7dKc,5766
-apprise/plugins/ses.py,sha256=CF17VZOEZybwdgqqu00qSoombTP5z0M8P_XxPmyc2f4,33528
-apprise/plugins/signal_api.py,sha256=PeCB_1YJc4lZwDdArTgzHP-Vhe9iwCNIYe4WVW_HgUo,16716
-apprise/plugins/simplepush.py,sha256=bL0WiRUCp39ST9X_0FNAFJJ1BFtd1t5OD_JTRneUGFY,10859
-apprise/plugins/sinch.py,sha256=0-z_cNIWMJu4kdTca-6B3raAIRV-PG1E7fUtbxUDECo,16796
-apprise/plugins/slack.py,sha256=tLbJsr97Ddp8bq1ozSEp1ssLsh913uC0Y24Xm3TN4Bo,42508
-apprise/plugins/smseagle.py,sha256=WbULwfwnUEkPw_z-2cVp2TzrupS7fkPfcQgq779nG8k,24144
-apprise/plugins/smsmanager.py,sha256=aSSZcvpWjKEdDg-XPyD-9fTkaQ0FodvuuO7Hqg7N6Tk,14112
-apprise/plugins/smtp2go.py,sha256=D3C4rWGCJ-oqaZH8JgoMEV_3BYHCCHMd6M7cG0piIvA,19698
-apprise/plugins/sns.py,sha256=dA58nElGwKKnVAr--rh1deIa9BNPbZElK6cb5G1o3g8,24142
-apprise/plugins/sparkpost.py,sha256=ZR4866e1DefqOuuu3z_vBhS8C5YX0sj1G9WEhdWFMEk,27865
-apprise/plugins/streamlabs.py,sha256=Pyrz2xY2rDo8rnTgu4L5t2u1EPrZWVcIP37k8pE2SaE,16010
-apprise/plugins/synology.py,sha256=-g-Cesx8g-nG10shjUAnYtyLpMoGfUNDcTIGfi2UXDE,11088
-apprise/plugins/syslog.py,sha256=sNKh0iSNc3ARuMIO13uwRirMHzW2VxxTRwyZ-0UYL60,10604
-apprise/plugins/techuluspush.py,sha256=HV1m72pRsC3IfVN66zWK9joslDJsKRKYD6_uRfqjnHk,7240
-apprise/plugins/telegram.py,sha256=zsmCUJU-5INyJ-RDUYIHUEXpwnwShOISWc4Xf7Epanw,37168
-apprise/plugins/threema.py,sha256=aWvFfN5Ve0DZCDX7qJVlY8INT_C-AWh-jnYnPTd7Ufs,11868
-apprise/plugins/twilio.py,sha256=0iYa2ug_2_Rbz4N_lGVihtSSxxFaK2f7Sdr9oK_Wg18,15959
-apprise/plugins/twist.py,sha256=hLqabH_STcZiAwRCgFHO7n5qYx7eZgoDw4xT5Zl_y6Q,28824
-apprise/plugins/twitter.py,sha256=ZTHLuZYowQ6qSw9ujsRB5oNp9F9PyutU-iAKAUOkmT8,30129
-apprise/plugins/voipms.py,sha256=NVbrsY7fJG0MbF6eId--0wo9cRC2kehhg8L0sASQs2w,12539
-apprise/plugins/vonage.py,sha256=PRFMdjn0ARqOEhL8kXySz8pi9vsApl2fh9mZyLVySgo,13414
-apprise/plugins/webexteams.py,sha256=DErDmHhvnHfsAyp4L3mF6vSfq0WabL1lbbl-jDUKYTw,9151
-apprise/plugins/wecombot.py,sha256=o5CO0IyHN7wAXhf7es08QiPCmUl8shZCgN_nyJxycVA,8776
-apprise/plugins/whatsapp.py,sha256=9KObQEvUOtOclnudKhNj7qRrJ0uii7dhfxgwzuMHKxY,19911
-apprise/plugins/windows.py,sha256=88bDJQBnuuA0u7_xoTC-1Ppxt4tz39UMZseRY3EX_FE,8550
-apprise/plugins/xbmc.py,sha256=2ssX2AItDUy5FJFDY9r_JI4u7qc0CLGvG-hW0KtgWag,12079
-apprise/plugins/zulip.py,sha256=PJMB8RmV_ddP5waNAQ0Z29cpIut1WFY31DLFeg8-Nao,13955
-apprise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-apprise/url.py,sha256=QEoqmWzapzXPwBXe85SdJaPWq7B4gcv4QCeJtndN4_E,29455
-apprise/url.pyi,sha256=WLaRREH7FzZ5x3-qkDkupojWGFC4uFwJ1EDt02lVs8c,520
-apprise/utils.py,sha256=Sy0pVslC8FDKh5RY8o6eVB-sPHFxBXFTdbhKSVf4UDM,53461
diff --git a/libs/apprise/Apprise.py b/libs/apprise/Apprise.py
new file mode 100644
index 000000000..9a3e8dfc7
--- /dev/null
+++ b/libs/apprise/Apprise.py
@@ -0,0 +1,887 @@
+# -*- coding: utf-8 -*-
+# BSD 2-Clause License
+#
+# Apprise - Push Notification Library.
+# Copyright (c) 2024, Chris Caron <[email protected]>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import asyncio
+import concurrent.futures as cf
+import os
+from itertools import chain
+from . import common
+from .conversion import convert_between
+from .utils import is_exclusive_match
+from .NotificationManager import NotificationManager
+from .utils import parse_list
+from .utils import parse_urls
+from .utils import cwe312_url
+from .emojis import apply_emojis
+from .logger import logger
+from .AppriseAsset import AppriseAsset
+from .AppriseConfig import AppriseConfig
+from .AppriseAttachment import AppriseAttachment
+from .AppriseLocale import AppriseLocale
+from .config.ConfigBase import ConfigBase
+from .plugins.NotifyBase import NotifyBase
+
+from . import plugins
+from . import __version__
+
+# Grant access to our Notification Manager Singleton
+N_MGR = NotificationManager()
+
+
+class Apprise:
+ """
+ Our Notification Manager
+
+ """
+
+ def __init__(self, servers=None, asset=None, location=None, debug=False):
+ """
+ Loads a set of server urls while applying the Asset() module to each
+ if specified.
+
+ If no asset is provided, then the default asset is used.
+
+ Optionally specify a global ContentLocation for a more strict means
+ of handling Attachments.
+ """
+
+ # Initialize a server list of URLs
+ self.servers = list()
+
+ # Assigns an central asset object that will be later passed into each
+ # notification plugin. Assets contain information such as the local
+ # directory images can be found in. It can also identify remote
+ # URL paths that contain the images you want to present to the end
+ # user. If no asset is specified, then the default one is used.
+ self.asset = \
+ asset if isinstance(asset, AppriseAsset) else AppriseAsset()
+
+ if servers:
+ self.add(servers)
+
+ # Initialize our locale object
+ self.locale = AppriseLocale()
+
+ # Set our debug flag
+ self.debug = debug
+
+ # Store our hosting location for optional strict rule handling
+ # of Attachments. Setting this to None removes any attachment
+ # restrictions.
+ self.location = location
+
+ @staticmethod
+ def instantiate(url, asset=None, tag=None, suppress_exceptions=True):
+ """
+ Returns the instance of a instantiated plugin based on the provided
+ Server URL. If the url fails to be parsed, then None is returned.
+
+ The specified url can be either a string (the URL itself) or a
+ dictionary containing all of the components needed to istantiate
+ the notification service. If identifying a dictionary, at the bare
+ minimum, one must specify the schema.
+
+ An example of a url dictionary object might look like:
+ {
+ schema: 'mailto',
+ host: 'google.com',
+ user: 'myuser',
+ password: 'mypassword',
+ }
+
+ Alternatively the string is much easier to specify:
+ mailto://user:[email protected]
+
+ The dictionary works well for people who are calling details() to
+ extract the components they need to build the URL manually.
+ """
+
+ # Initialize our result set
+ results = None
+
+ # Prepare our Asset Object
+ asset = asset if isinstance(asset, AppriseAsset) else AppriseAsset()
+
+ if isinstance(url, str):
+ # Acquire our url tokens
+ results = plugins.url_to_dict(
+ url, secure_logging=asset.secure_logging)
+
+ if results is None:
+ # Failed to parse the server URL; detailed logging handled
+ # inside url_to_dict - nothing to report here.
+ return None
+
+ elif isinstance(url, dict):
+ # We already have our result set
+ results = url
+
+ if results.get('schema') not in N_MGR:
+ # schema is a mandatory dictionary item as it is the only way
+ # we can index into our loaded plugins
+ logger.error('Dictionary does not include a "schema" entry.')
+ logger.trace(
+ 'Invalid dictionary unpacked as:{}{}'.format(
+ os.linesep, os.linesep.join(
+ ['{}="{}"'.format(k, v)
+ for k, v in results.items()])))
+ return None
+
+ logger.trace(
+ 'Dictionary unpacked as:{}{}'.format(
+ os.linesep, os.linesep.join(
+ ['{}="{}"'.format(k, v) for k, v in results.items()])))
+
+ # Otherwise we handle the invalid input specified
+ else:
+ logger.error(
+ 'An invalid URL type (%s) was specified for instantiation',
+ type(url))
+ return None
+
+ if not N_MGR[results['schema']].enabled:
+ #
+ # First Plugin Enable Check (Pre Initialization)
+ #
+
+ # Plugin has been disabled at a global level
+ logger.error(
+ '%s:// is disabled on this system.', results['schema'])
+ return None
+
+ # Build a list of tags to associate with the newly added notifications
+ results['tag'] = set(parse_list(tag))
+
+ # Set our Asset Object
+ results['asset'] = asset
+
+ if suppress_exceptions:
+ try:
+ # Attempt to create an instance of our plugin using the parsed
+ # URL information
+ plugin = N_MGR[results['schema']](**results)
+
+ # Create log entry of loaded URL
+ logger.debug(
+ 'Loaded {} URL: {}'.format(
+ N_MGR[results['schema']].service_name,
+ plugin.url(privacy=asset.secure_logging)))
+
+ except Exception:
+ # CWE-312 (Secure Logging) Handling
+ loggable_url = url if not asset.secure_logging \
+ else cwe312_url(url)
+
+ # the arguments are invalid or can not be used.
+ logger.error(
+ 'Could not load {} URL: {}'.format(
+ N_MGR[results['schema']].service_name,
+ loggable_url))
+ return None
+
+ else:
+ # Attempt to create an instance of our plugin using the parsed
+ # URL information but don't wrap it in a try catch
+ plugin = N_MGR[results['schema']](**results)
+
+ if not plugin.enabled:
+ #
+ # Second Plugin Enable Check (Post Initialization)
+ #
+
+ # Service/Plugin is disabled (on a more local level). This is a
+ # case where the plugin was initially enabled but then after the
+ # __init__() was called under the hood something pre-determined
+ # that it could no longer be used.
+
+ # The only downside to doing it this way is services are
+ # initialized prior to returning the details() if 3rd party tools
+ # are polling what is available. These services that become
+ # disabled thereafter are shown initially that they can be used.
+ logger.error(
+ '%s:// has become disabled on this system.', results['schema'])
+ return None
+
+ return plugin
+
+ def add(self, servers, asset=None, tag=None):
+ """
+ Adds one or more server URLs into our list.
+
+ You can override the global asset if you wish by including it with the
+ server(s) that you add.
+
+ The tag allows you to associate 1 or more tag values to the server(s)
+ being added. tagging a service allows you to exclusively access them
+ when calling the notify() function.
+ """
+
+ # Initialize our return status
+ return_status = True
+
+ if asset is None:
+ # prepare default asset
+ asset = self.asset
+
+ if isinstance(servers, str):
+ # build our server list
+ servers = parse_urls(servers)
+ if len(servers) == 0:
+ return False
+
+ elif isinstance(servers, dict):
+ # no problem, we support kwargs, convert it to a list
+ servers = [servers]
+
+ elif isinstance(servers, (ConfigBase, NotifyBase, AppriseConfig)):
+ # Go ahead and just add our plugin into our list
+ self.servers.append(servers)
+ return True
+
+ elif not isinstance(servers, (tuple, set, list)):
+ logger.error(
+ "An invalid notification (type={}) was specified.".format(
+ type(servers)))
+ return False
+
+ for _server in servers:
+
+ if isinstance(_server, (ConfigBase, NotifyBase, AppriseConfig)):
+ # Go ahead and just add our plugin into our list
+ self.servers.append(_server)
+ continue
+
+ elif not isinstance(_server, (str, dict)):
+ logger.error(
+ "An invalid notification (type={}) was specified.".format(
+ type(_server)))
+ return_status = False
+ continue
+
+ # Instantiate ourselves an object, this function throws or
+ # returns None if it fails
+ instance = Apprise.instantiate(_server, asset=asset, tag=tag)
+ if not isinstance(instance, NotifyBase):
+ # No logging is required as instantiate() handles failure
+ # and/or success reasons for us
+ return_status = False
+ continue
+
+ # Add our initialized plugin to our server listings
+ self.servers.append(instance)
+
+ # Return our status
+ return return_status
+
+ def clear(self):
+ """
+ Empties our server list
+
+ """
+ self.servers[:] = []
+
+ def find(self, tag=common.MATCH_ALL_TAG, match_always=True):
+ """
+ Returns a list of all servers matching against the tag specified.
+
+ """
+
+ # Build our tag setup
+ # - top level entries are treated as an 'or'
+ # - second level (or more) entries are treated as 'and'
+ #
+ # examples:
+ # tag="tagA, tagB" = tagA or tagB
+ # tag=['tagA', 'tagB'] = tagA or tagB
+ # tag=[('tagA', 'tagC'), 'tagB'] = (tagA and tagC) or tagB
+ # tag=[('tagB', 'tagC')] = tagB and tagC
+
+ # A match_always flag allows us to pick up on our 'any' keyword
+ # and notify these services under all circumstances
+ match_always = common.MATCH_ALWAYS_TAG if match_always else None
+
+ # Iterate over our loaded plugins
+ for entry in self.servers:
+
+ if isinstance(entry, (ConfigBase, AppriseConfig)):
+ # load our servers
+ servers = entry.servers()
+
+ else:
+ servers = [entry, ]
+
+ for server in servers:
+ # Apply our tag matching based on our defined logic
+ if is_exclusive_match(
+ logic=tag, data=server.tags,
+ match_all=common.MATCH_ALL_TAG,
+ match_always=match_always):
+ yield server
+ return
+
+ def notify(self, body, title='', notify_type=common.NotifyType.INFO,
+ body_format=None, tag=common.MATCH_ALL_TAG, match_always=True,
+ attach=None, interpret_escapes=None):
+ """
+ Send a notification to all the plugins previously loaded.
+
+ If the body_format specified is NotifyFormat.MARKDOWN, it will
+ be converted to HTML if the Notification type expects this.
+
+ if the tag is specified (either a string or a set/list/tuple
+ of strings), then only the notifications flagged with that
+ tagged value are notified. By default, all added services
+ are notified (tag=MATCH_ALL_TAG)
+
+ This function returns True if all notifications were successfully
+ sent, False if even just one of them fails, and None if no
+ notifications were sent at all as a result of tag filtering and/or
+ simply having empty configuration files that were read.
+
+ Attach can contain a list of attachment URLs. attach can also be
+ represented by an AttachBase() (or list of) object(s). This
+ identifies the products you wish to notify
+
+ Set interpret_escapes to True if you want to pre-escape a string
+ such as turning a \n into an actual new line, etc.
+ """
+
+ try:
+ # Process arguments and build synchronous and asynchronous calls
+ # (this step can throw internal errors).
+ sequential_calls, parallel_calls = self._create_notify_calls(
+ body, title,
+ notify_type=notify_type, body_format=body_format,
+ tag=tag, match_always=match_always, attach=attach,
+ interpret_escapes=interpret_escapes,
+ )
+
+ except TypeError:
+ # No notifications sent, and there was an internal error.
+ return False
+
+ if not sequential_calls and not parallel_calls:
+ # Nothing to send
+ return None
+
+ sequential_result = Apprise._notify_sequential(*sequential_calls)
+ parallel_result = Apprise._notify_parallel_threadpool(*parallel_calls)
+ return sequential_result and parallel_result
+
+ async def async_notify(self, *args, **kwargs):
+ """
+ Send a notification to all the plugins previously loaded, for
+ asynchronous callers.
+
+ The arguments are identical to those of Apprise.notify().
+
+ """
+ try:
+ # Process arguments and build synchronous and asynchronous calls
+ # (this step can throw internal errors).
+ sequential_calls, parallel_calls = self._create_notify_calls(
+ *args, **kwargs)
+
+ except TypeError:
+ # No notifications sent, and there was an internal error.
+ return False
+
+ if not sequential_calls and not parallel_calls:
+ # Nothing to send
+ return None
+
+ sequential_result = Apprise._notify_sequential(*sequential_calls)
+ parallel_result = \
+ await Apprise._notify_parallel_asyncio(*parallel_calls)
+ return sequential_result and parallel_result
+
+ def _create_notify_calls(self, *args, **kwargs):
+ """
+ Creates notifications for all the plugins loaded.
+
+ Returns a list of (server, notify() kwargs) tuples for plugins with
+ parallelism disabled and another list for plugins with parallelism
+ enabled.
+ """
+
+ all_calls = list(self._create_notify_gen(*args, **kwargs))
+
+ # Split into sequential and parallel notify() calls.
+ sequential, parallel = [], []
+ for (server, notify_kwargs) in all_calls:
+ if server.asset.async_mode:
+ parallel.append((server, notify_kwargs))
+ else:
+ sequential.append((server, notify_kwargs))
+
+ return sequential, parallel
+
+ def _create_notify_gen(self, body, title='',
+ notify_type=common.NotifyType.INFO,
+ body_format=None, tag=common.MATCH_ALL_TAG,
+ match_always=True, attach=None,
+ interpret_escapes=None):
+ """
+ Internal generator function for _create_notify_calls().
+ """
+
+ if len(self) == 0:
+ # Nothing to notify
+ msg = "There are no service(s) to notify"
+ logger.error(msg)
+ raise TypeError(msg)
+
+ if not (title or body or attach):
+ msg = "No message content specified to deliver"
+ logger.error(msg)
+ raise TypeError(msg)
+
+ try:
+ if title and isinstance(title, bytes):
+ title = title.decode(self.asset.encoding)
+
+ if body and isinstance(body, bytes):
+ body = body.decode(self.asset.encoding)
+
+ except UnicodeDecodeError:
+ msg = 'The content passed into Apprise was not of encoding ' \
+ 'type: {}'.format(self.asset.encoding)
+ logger.error(msg)
+ raise TypeError(msg)
+
+ # Tracks conversions
+ conversion_body_map = dict()
+ conversion_title_map = dict()
+
+ # Prepare attachments if required
+ if attach is not None and not isinstance(attach, AppriseAttachment):
+ attach = AppriseAttachment(
+ attach, asset=self.asset, location=self.location)
+
+ # Allow Asset default value
+ body_format = self.asset.body_format \
+ if body_format is None else body_format
+
+ # Allow Asset default value
+ interpret_escapes = self.asset.interpret_escapes \
+ if interpret_escapes is None else interpret_escapes
+
+ # Iterate over our loaded plugins
+ for server in self.find(tag, match_always=match_always):
+ # If our code reaches here, we either did not define a tag (it
+ # was set to None), or we did define a tag and the logic above
+ # determined we need to notify the service it's associated with
+
+ # First we need to generate a key we will use to determine if we
+ # need to build our data out. Entries without are merged with
+ # the body at this stage.
+ key = server.notify_format if server.title_maxlen > 0\
+ else f'_{server.notify_format}'
+
+ if server.interpret_emojis:
+ # alter our key slightly to handle emojis since their value is
+ # pulled out of the notification
+ key += "-emojis"
+
+ if key not in conversion_title_map:
+
+ # Prepare our title
+ conversion_title_map[key] = '' if not title else title
+
+ # Conversion of title only occurs for services where the title
+ # is blended with the body (title_maxlen <= 0)
+ if conversion_title_map[key] and server.title_maxlen <= 0:
+ conversion_title_map[key] = convert_between(
+ body_format, server.notify_format,
+ content=conversion_title_map[key])
+
+ # Our body is always converted no matter what
+ conversion_body_map[key] = \
+ convert_between(
+ body_format, server.notify_format, content=body)
+
+ if interpret_escapes:
+ #
+ # Escape our content
+ #
+
+ try:
+ # Added overhead required due to Python 3 Encoding Bug
+ # identified here: https://bugs.python.org/issue21331
+ conversion_body_map[key] = \
+ conversion_body_map[key]\
+ .encode('ascii', 'backslashreplace')\
+ .decode('unicode-escape')
+
+ conversion_title_map[key] = \
+ conversion_title_map[key]\
+ .encode('ascii', 'backslashreplace')\
+ .decode('unicode-escape')
+
+ except AttributeError:
+ # Must be of string type
+ msg = 'Failed to escape message body'
+ logger.error(msg)
+ raise TypeError(msg)
+
+ if server.interpret_emojis:
+ #
+ # Convert our :emoji: definitions
+ #
+
+ conversion_body_map[key] = \
+ apply_emojis(conversion_body_map[key])
+ conversion_title_map[key] = \
+ apply_emojis(conversion_title_map[key])
+
+ kwargs = dict(
+ body=conversion_body_map[key],
+ title=conversion_title_map[key],
+ notify_type=notify_type,
+ attach=attach,
+ body_format=body_format
+ )
+ yield (server, kwargs)
+
+ @staticmethod
+ def _notify_sequential(*servers_kwargs):
+ """
+ Process a list of notify() calls sequentially and synchronously.
+ """
+
+ success = True
+
+ for (server, kwargs) in servers_kwargs:
+ try:
+ # Send notification
+ result = server.notify(**kwargs)
+ success = success and result
+
+ except TypeError:
+ # These are our internally thrown notifications.
+ success = False
+
+ except Exception:
+ # A catch all so we don't have to abort early
+ # just because one of our plugins has a bug in it.
+ logger.exception("Unhandled Notification Exception")
+ success = False
+
+ return success
+
+ @staticmethod
+ def _notify_parallel_threadpool(*servers_kwargs):
+ """
+ Process a list of notify() calls in parallel and synchronously.
+ """
+
+ n_calls = len(servers_kwargs)
+
+ # 0-length case
+ if n_calls == 0:
+ return True
+
+ # There's no need to use a thread pool for just a single notification
+ if n_calls == 1:
+ return Apprise._notify_sequential(servers_kwargs[0])
+
+ # Create log entry
+ logger.info(
+ 'Notifying %d service(s) with threads.', len(servers_kwargs))
+
+ with cf.ThreadPoolExecutor() as executor:
+ success = True
+ futures = [executor.submit(server.notify, **kwargs)
+ for (server, kwargs) in servers_kwargs]
+
+ for future in cf.as_completed(futures):
+ try:
+ result = future.result()
+ success = success and result
+
+ except TypeError:
+ # These are our internally thrown notifications.
+ success = False
+
+ except Exception:
+ # A catch all so we don't have to abort early
+ # just because one of our plugins has a bug in it.
+ logger.exception("Unhandled Notification Exception")
+ success = False
+
+ return success
+
+ @staticmethod
+ async def _notify_parallel_asyncio(*servers_kwargs):
+ """
+ Process a list of async_notify() calls in parallel and asynchronously.
+ """
+
+ n_calls = len(servers_kwargs)
+
+ # 0-length case
+ if n_calls == 0:
+ return True
+
+ # (Unlike with the thread pool, we don't optimize for the single-
+ # notification case because asyncio can do useful work while waiting
+ # for that thread to complete)
+
+ # Create log entry
+ logger.info(
+ 'Notifying %d service(s) asynchronously.', len(servers_kwargs))
+
+ async def do_call(server, kwargs):
+ return await server.async_notify(**kwargs)
+
+ cors = (do_call(server, kwargs) for (server, kwargs) in servers_kwargs)
+ results = await asyncio.gather(*cors, return_exceptions=True)
+
+ if any(isinstance(status, Exception)
+ and not isinstance(status, TypeError) for status in results):
+ # A catch all so we don't have to abort early just because
+ # one of our plugins has a bug in it.
+ logger.exception("Unhandled Notification Exception")
+ return False
+
+ if any(isinstance(status, TypeError) for status in results):
+ # These are our internally thrown notifications.
+ return False
+
+ return all(results)
+
+ def details(self, lang=None, show_requirements=False, show_disabled=False):
+ """
+ Returns the details associated with the Apprise object
+
+ """
+
+ # general object returned
+ response = {
+ # Defines the current version of Apprise
+ 'version': __version__,
+ # Lists all of the currently supported Notifications
+ 'schemas': [],
+ # Includes the configured asset details
+ 'asset': self.asset.details(),
+ }
+
+ for plugin in N_MGR.plugins():
+ # Iterate over our hashed plugins and dynamically build details on
+ # their status:
+
+ content = {
+ 'service_name': getattr(plugin, 'service_name', None),
+ 'service_url': getattr(plugin, 'service_url', None),
+ 'setup_url': getattr(plugin, 'setup_url', None),
+ # Placeholder - populated below
+ 'details': None,
+
+ # Let upstream service know of the plugins that support
+ # attachments
+ 'attachment_support': getattr(
+ plugin, 'attachment_support', False),
+
+ # Differentiat between what is a custom loaded plugin and
+ # which is native.
+ 'category': getattr(plugin, 'category', None)
+ }
+
+ # Standard protocol(s) should be None or a tuple
+ enabled = getattr(plugin, 'enabled', True)
+ if not show_disabled and not enabled:
+ # Do not show inactive plugins
+ continue
+
+ elif show_disabled:
+ # Add current state to response
+ content['enabled'] = enabled
+
+ # Standard protocol(s) should be None or a tuple
+ protocols = getattr(plugin, 'protocol', None)
+ if isinstance(protocols, str):
+ protocols = (protocols, )
+
+ # Secure protocol(s) should be None or a tuple
+ secure_protocols = getattr(plugin, 'secure_protocol', None)
+ if isinstance(secure_protocols, str):
+ secure_protocols = (secure_protocols, )
+
+ # Add our protocol details to our content
+ content.update({
+ 'protocols': protocols,
+ 'secure_protocols': secure_protocols,
+ })
+
+ if not lang:
+ # Simply return our results
+ content['details'] = plugins.details(plugin)
+ if show_requirements:
+ content['requirements'] = plugins.requirements(plugin)
+
+ else:
+ # Emulate the specified language when returning our results
+ with self.locale.lang_at(lang):
+ content['details'] = plugins.details(plugin)
+ if show_requirements:
+ content['requirements'] = plugins.requirements(plugin)
+
+ # Build our response object
+ response['schemas'].append(content)
+
+ return response
+
+ def urls(self, privacy=False):
+ """
+ Returns all of the loaded URLs defined in this apprise object.
+ """
+ return [x.url(privacy=privacy) for x in self.servers]
+
+ def pop(self, index):
+ """
+ Removes an indexed Notification Service from the stack and returns it.
+
+ The thing is we can never pop AppriseConfig() entries, only what was
+ loaded within them. So pop needs to carefully iterate over our list
+ and only track actual entries.
+ """
+
+ # Tracking variables
+ prev_offset = -1
+ offset = prev_offset
+
+ for idx, s in enumerate(self.servers):
+ if isinstance(s, (ConfigBase, AppriseConfig)):
+ servers = s.servers()
+ if len(servers) > 0:
+ # Acquire a new maximum offset to work with
+ offset = prev_offset + len(servers)
+
+ if offset >= index:
+ # we can pop an element from our config stack
+ fn = s.pop if isinstance(s, ConfigBase) \
+ else s.server_pop
+
+ return fn(index if prev_offset == -1
+ else (index - prev_offset - 1))
+
+ else:
+ offset = prev_offset + 1
+ if offset == index:
+ return self.servers.pop(idx)
+
+ # Update our old offset
+ prev_offset = offset
+
+ # If we reach here, then we indexed out of range
+ raise IndexError('list index out of range')
+
+ def __getitem__(self, index):
+ """
+ Returns the indexed server entry of a loaded notification server
+ """
+ # Tracking variables
+ prev_offset = -1
+ offset = prev_offset
+
+ for idx, s in enumerate(self.servers):
+ if isinstance(s, (ConfigBase, AppriseConfig)):
+ # Get our list of servers associate with our config object
+ servers = s.servers()
+ if len(servers) > 0:
+ # Acquire a new maximum offset to work with
+ offset = prev_offset + len(servers)
+
+ if offset >= index:
+ return servers[index if prev_offset == -1
+ else (index - prev_offset - 1)]
+
+ else:
+ offset = prev_offset + 1
+ if offset == index:
+ return self.servers[idx]
+
+ # Update our old offset
+ prev_offset = offset
+
+ # If we reach here, then we indexed out of range
+ raise IndexError('list index out of range')
+
+ def __getstate__(self):
+ """
+ Pickle Support dumps()
+ """
+ attributes = {
+ 'asset': self.asset,
+ # Prepare our URL list as we need to extract the associated tags
+ # and asset details associated with it
+ 'urls': [{
+ 'url': server.url(privacy=False),
+ 'tag': server.tags if server.tags else None,
+ 'asset': server.asset} for server in self.servers],
+ 'locale': self.locale,
+ 'debug': self.debug,
+ 'location': self.location,
+ }
+
+ return attributes
+
+ def __setstate__(self, state):
+ """
+ Pickle Support loads()
+ """
+ self.servers = list()
+ self.asset = state['asset']
+ self.locale = state['locale']
+ self.location = state['location']
+ for entry in state['urls']:
+ self.add(entry['url'], asset=entry['asset'], tag=entry['tag'])
+
+ def __bool__(self):
+ """
+ Allows the Apprise object to be wrapped in an 'if statement'.
+ True is returned if at least one service has been loaded.
+ """
+ return len(self) > 0
+
+ def __iter__(self):
+ """
+ Returns an iterator to each of our servers loaded. This includes those
+ found inside configuration.
+ """
+ return chain(*[[s] if not isinstance(s, (ConfigBase, AppriseConfig))
+ else iter(s.servers()) for s in self.servers])
+
+ def __len__(self):
+ """
+ Returns the number of servers loaded; this includes those found within
+ loaded configuration. This funtion nnever actually counts the
+ Config entry themselves (if they exist), only what they contain.
+ """
+ return sum([1 if not isinstance(s, (ConfigBase, AppriseConfig))
+ else len(s.servers()) for s in self.servers])
diff --git a/libs/apprise/Apprise.pyi b/libs/apprise/Apprise.pyi
new file mode 100644
index 000000000..5a34c9c65
--- /dev/null
+++ b/libs/apprise/Apprise.pyi
@@ -0,0 +1,62 @@
+from typing import Any, Dict, List, Iterable, Iterator, Optional
+
+from . import (AppriseAsset, AppriseAttachment, AppriseConfig, ConfigBase,
+ NotifyBase, NotifyFormat, NotifyType)
+from .common import ContentLocation
+
+_Server = Union[str, ConfigBase, NotifyBase, AppriseConfig]
+_Servers = Union[_Server, Dict[Any, _Server], Iterable[_Server]]
+# Can't define this recursively as mypy doesn't support recursive types:
+# https://github.com/python/mypy/issues/731
+_Tag = Union[str, Iterable[Union[str, Iterable[str]]]]
+
+class Apprise:
+ def __init__(
+ self,
+ servers: _Servers = ...,
+ asset: Optional[AppriseAsset] = ...,
+ location: Optional[ContentLocation] = ...,
+ debug: bool = ...
+ ) -> None: ...
+ @staticmethod
+ def instantiate(
+ url: Union[str, Dict[str, NotifyBase]],
+ asset: Optional[AppriseAsset] = ...,
+ tag: Optional[_Tag] = ...,
+ suppress_exceptions: bool = ...
+ ) -> NotifyBase: ...
+ def add(
+ self,
+ servers: _Servers = ...,
+ asset: Optional[AppriseAsset] = ...,
+ tag: Optional[_Tag] = ...
+ ) -> bool: ...
+ def clear(self) -> None: ...
+ def find(self, tag: str = ...) -> Iterator[Apprise]: ...
+ def notify(
+ self,
+ body: str,
+ title: str = ...,
+ notify_type: NotifyType = ...,
+ body_format: NotifyFormat = ...,
+ tag: _Tag = ...,
+ attach: Optional[AppriseAttachment] = ...,
+ interpret_escapes: Optional[bool] = ...
+ ) -> bool: ...
+ async def async_notify(
+ self,
+ body: str,
+ title: str = ...,
+ notify_type: NotifyType = ...,
+ body_format: NotifyFormat = ...,
+ tag: _Tag = ...,
+ attach: Optional[AppriseAttachment] = ...,
+ interpret_escapes: Optional[bool] = ...
+ ) -> bool: ...
+ def details(self, lang: Optional[str] = ...) -> Dict[str, Any]: ...
+ def urls(self, privacy: bool = ...) -> Iterable[str]: ...
+ def pop(self, index: int) -> ConfigBase: ...
+ def __getitem__(self, index: int) -> ConfigBase: ...
+ def __bool__(self) -> bool: ...
+ def __iter__(self) -> Iterator[ConfigBase]: ...
+ def __len__(self) -> int: ... \ No newline at end of file
diff --git a/libs/apprise/asset.py b/libs/apprise/AppriseAsset.py
index 450303d0e..97a7bccfb 100644
--- a/libs/apprise/asset.py
+++ b/libs/apprise/AppriseAsset.py
@@ -33,7 +33,7 @@ from os.path import dirname
from os.path import isfile
from os.path import abspath
from .common import NotifyType
-from .manager_plugins import NotificationManager
+from .NotificationManager import NotificationManager
# Grant access to our Notification Manager Singleton
diff --git a/libs/apprise/asset.pyi b/libs/apprise/AppriseAsset.pyi
index 08303341b..08303341b 100644
--- a/libs/apprise/asset.pyi
+++ b/libs/apprise/AppriseAsset.pyi
diff --git a/libs/apprise/apprise_attachment.py b/libs/apprise/AppriseAttachment.py
index 3c33f9e73..fcfed3af6 100644
--- a/libs/apprise/apprise_attachment.py
+++ b/libs/apprise/AppriseAttachment.py
@@ -27,9 +27,9 @@
# POSSIBILITY OF SUCH DAMAGE.
from . import URLBase
-from .attachment.base import AttachBase
-from .asset import AppriseAsset
-from .manager_attachment import AttachmentManager
+from .attachment.AttachBase import AttachBase
+from .AppriseAsset import AppriseAsset
+from .AttachmentManager import AttachmentManager
from .logger import logger
from .common import ContentLocation
from .common import CONTENT_LOCATIONS
diff --git a/libs/apprise/apprise_attachment.pyi b/libs/apprise/AppriseAttachment.pyi
index a28acb144..a28acb144 100644
--- a/libs/apprise/apprise_attachment.pyi
+++ b/libs/apprise/AppriseAttachment.pyi
diff --git a/libs/apprise/apprise_config.py b/libs/apprise/AppriseConfig.py
index 080f70d30..7e5a9126f 100644
--- a/libs/apprise/apprise_config.py
+++ b/libs/apprise/AppriseConfig.py
@@ -28,9 +28,9 @@
from . import ConfigBase
from . import CONFIG_FORMATS
-from .manager_config import ConfigurationManager
+from .ConfigurationManager import ConfigurationManager
from . import URLBase
-from .asset import AppriseAsset
+from .AppriseAsset import AppriseAsset
from . import common
from .utils import GET_SCHEMA_RE
from .utils import parse_list
diff --git a/libs/apprise/apprise_config.pyi b/libs/apprise/AppriseConfig.pyi
index 9ea819ac3..9ea819ac3 100644
--- a/libs/apprise/apprise_config.pyi
+++ b/libs/apprise/AppriseConfig.pyi
diff --git a/libs/apprise/locale.py b/libs/apprise/AppriseLocale.py
index e900ce5bc..e900ce5bc 100644
--- a/libs/apprise/locale.py
+++ b/libs/apprise/AppriseLocale.py
diff --git a/libs/apprise/manager_attachment.py b/libs/apprise/AttachmentManager.py
index d1288a943..d296a4996 100644
--- a/libs/apprise/manager_attachment.py
+++ b/libs/apprise/AttachmentManager.py
@@ -26,7 +26,6 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-import re
from os.path import dirname
from os.path import abspath
from os.path import join
@@ -53,7 +52,3 @@ class AttachmentManager(PluginManager):
# The module path to scan
module_path = join(abspath(dirname(__file__)), _id)
-
- # For filtering our result set
- module_filter_re = re.compile(
- r'^(?P<name>' + fname_prefix + r'(?!Base)[A-Za-z0-9]+)$')
diff --git a/libs/apprise/manager_config.py b/libs/apprise/ConfigurationManager.py
index 69a6bedb9..6696895b9 100644
--- a/libs/apprise/manager_config.py
+++ b/libs/apprise/ConfigurationManager.py
@@ -26,7 +26,6 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-import re
from os.path import dirname
from os.path import abspath
from os.path import join
@@ -53,7 +52,3 @@ class ConfigurationManager(PluginManager):
# The module path to scan
module_path = join(abspath(dirname(__file__)), _id)
-
- # For filtering our result set
- module_filter_re = re.compile(
- r'^(?P<name>' + fname_prefix + r'(?!Base)[A-Za-z0-9]+)$')
diff --git a/libs/apprise/manager_plugins.py b/libs/apprise/NotificationManager.py
index 74ed370ea..abbbdd203 100644
--- a/libs/apprise/manager_plugins.py
+++ b/libs/apprise/NotificationManager.py
@@ -26,7 +26,6 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-import re
from os.path import dirname
from os.path import abspath
from os.path import join
@@ -53,8 +52,3 @@ class NotificationManager(PluginManager):
# The module path to scan
module_path = join(abspath(dirname(__file__)), _id)
-
- # For filtering our result set
- module_filter_re = re.compile(
- r'^(?P<name>' + fname_prefix +
- r'(?!Base|ImageSize|Type)[A-Za-z0-9]+)$')
diff --git a/libs/apprise/url.py b/libs/apprise/URLBase.py
index 39daec867..90ea85c66 100644
--- a/libs/apprise/url.py
+++ b/libs/apprise/URLBase.py
@@ -35,8 +35,8 @@ from xml.sax.saxutils import escape as sax_escape
from urllib.parse import unquote as _unquote
from urllib.parse import quote as _quote
-from .locale import gettext_lazy as _
-from .asset import AppriseAsset
+from .AppriseLocale import gettext_lazy as _
+from .AppriseAsset import AppriseAsset
from .utils import urlencode
from .utils import parse_url
from .utils import parse_bool
@@ -744,7 +744,7 @@ class URLBase:
@staticmethod
def parse_url(url, verify_host=True, plus_to_space=False,
- strict_port=False, sanitize=True):
+ strict_port=False):
"""Parses the URL and returns it broken apart into a dictionary.
This is very specific and customized for Apprise.
@@ -765,8 +765,7 @@ class URLBase:
results = parse_url(
url, default_schema='unknown', verify_host=verify_host,
- plus_to_space=plus_to_space, strict_port=strict_port,
- sanitize=sanitize)
+ plus_to_space=plus_to_space, strict_port=strict_port)
if not results:
# We're done; we failed to parse our url
diff --git a/libs/apprise/url.pyi b/libs/apprise/URLBase.pyi
index 915885745..915885745 100644
--- a/libs/apprise/url.pyi
+++ b/libs/apprise/URLBase.pyi
diff --git a/libs/apprise/__init__.py b/libs/apprise/__init__.py
index 457528594..81373c75b 100644
--- a/libs/apprise/__init__.py
+++ b/libs/apprise/__init__.py
@@ -27,7 +27,7 @@
# POSSIBILITY OF SUCH DAMAGE.
__title__ = 'Apprise'
-__version__ = '1.8.0'
+__version__ = '1.7.6'
__author__ = 'Chris Caron'
__license__ = 'BSD'
__copywrite__ = 'Copyright (C) 2024 Chris Caron <[email protected]>'
@@ -49,17 +49,16 @@ from .common import CONTENT_INCLUDE_MODES
from .common import ContentLocation
from .common import CONTENT_LOCATIONS
-from .url import URLBase
-from .url import PrivacyMode
-from .plugins.base import NotifyBase
-from .config.base import ConfigBase
-from .attachment.base import AttachBase
+from .URLBase import URLBase
+from .URLBase import PrivacyMode
+from .plugins.NotifyBase import NotifyBase
+from .config.ConfigBase import ConfigBase
+from .attachment.AttachBase import AttachBase
-from .apprise import Apprise
-from .locale import AppriseLocale
-from .asset import AppriseAsset
-from .apprise_config import AppriseConfig
-from .apprise_attachment import AppriseAttachment
+from .Apprise import Apprise
+from .AppriseAsset import AppriseAsset
+from .AppriseConfig import AppriseConfig
+from .AppriseAttachment import AppriseAttachment
from . import decorators
@@ -74,7 +73,7 @@ logging.getLogger(__name__).addHandler(logging.NullHandler())
__all__ = [
# Core
'Apprise', 'AppriseAsset', 'AppriseConfig', 'AppriseAttachment', 'URLBase',
- 'NotifyBase', 'ConfigBase', 'AttachBase', 'AppriseLocale',
+ 'NotifyBase', 'ConfigBase', 'AttachBase',
# Reference
'NotifyType', 'NotifyImageSize', 'NotifyFormat', 'OverflowMode',
diff --git a/libs/apprise/attachment/base.py b/libs/apprise/attachment/AttachBase.py
index 71e3a4d0d..8cb6bd5cb 100644
--- a/libs/apprise/attachment/base.py
+++ b/libs/apprise/attachment/AttachBase.py
@@ -29,10 +29,10 @@
import os
import time
import mimetypes
-from ..url import URLBase
+from ..URLBase import URLBase
from ..utils import parse_bool
from ..common import ContentLocation
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class AttachBase(URLBase):
@@ -315,7 +315,7 @@ class AttachBase(URLBase):
"download() is implimented by the child class.")
@staticmethod
- def parse_url(url, verify_host=True, mimetype_db=None, sanitize=True):
+ def parse_url(url, verify_host=True, mimetype_db=None):
"""Parses the URL and returns it broken apart into a dictionary.
This is very specific and customized for Apprise.
@@ -333,8 +333,7 @@ class AttachBase(URLBase):
successful, otherwise None is returned.
"""
- results = URLBase.parse_url(
- url, verify_host=verify_host, sanitize=sanitize)
+ results = URLBase.parse_url(url, verify_host=verify_host)
if not results:
# We're done; we failed to parse our url
diff --git a/libs/apprise/attachment/base.pyi b/libs/apprise/attachment/AttachBase.pyi
index 66b7179d3..66b7179d3 100644
--- a/libs/apprise/attachment/base.pyi
+++ b/libs/apprise/attachment/AttachBase.pyi
diff --git a/libs/apprise/attachment/file.py b/libs/apprise/attachment/AttachFile.py
index c48a707ae..4c9c8f136 100644
--- a/libs/apprise/attachment/file.py
+++ b/libs/apprise/attachment/AttachFile.py
@@ -28,9 +28,9 @@
import re
import os
-from .base import AttachBase
+from .AttachBase import AttachBase
from ..common import ContentLocation
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class AttachFile(AttachBase):
diff --git a/libs/apprise/attachment/http.py b/libs/apprise/attachment/AttachHTTP.py
index aa075d671..5a3af9467 100644
--- a/libs/apprise/attachment/http.py
+++ b/libs/apprise/attachment/AttachHTTP.py
@@ -31,10 +31,10 @@ import os
import requests
import threading
from tempfile import NamedTemporaryFile
-from .base import AttachBase
+from .AttachBase import AttachBase
from ..common import ContentLocation
-from ..url import PrivacyMode
-from ..locale import gettext_lazy as _
+from ..URLBase import PrivacyMode
+from ..AppriseLocale import gettext_lazy as _
class AttachHTTP(AttachBase):
@@ -296,7 +296,8 @@ class AttachHTTP(AttachBase):
"""
Tidy memory if open
"""
- self.invalidate()
+ with self._lock:
+ self.invalidate()
def url(self, privacy=False, *args, **kwargs):
"""
@@ -362,7 +363,8 @@ class AttachHTTP(AttachBase):
us to re-instantiate this object.
"""
- results = AttachBase.parse_url(url, sanitize=False)
+ results = AttachBase.parse_url(url)
+
if not results:
# We're done early as we couldn't load the results
return results
diff --git a/libs/apprise/attachment/__init__.py b/libs/apprise/attachment/__init__.py
index c2aef1eec..0a88313d6 100644
--- a/libs/apprise/attachment/__init__.py
+++ b/libs/apprise/attachment/__init__.py
@@ -27,8 +27,8 @@
# POSSIBILITY OF SUCH DAMAGE.
# Used for testing
-from .base import AttachBase
-from ..manager_attachment import AttachmentManager
+from .AttachBase import AttachBase
+from ..AttachmentManager import AttachmentManager
# Initalize our Attachment Manager Singleton
A_MGR = AttachmentManager()
@@ -36,5 +36,4 @@ A_MGR = AttachmentManager()
__all__ = [
# Reference
'AttachBase',
- 'AttachmentManager',
]
diff --git a/libs/apprise/config/base.py b/libs/apprise/config/ConfigBase.py
index 953cee394..32e1bde34 100644
--- a/libs/apprise/config/base.py
+++ b/libs/apprise/config/ConfigBase.py
@@ -33,15 +33,15 @@ import time
from .. import plugins
from .. import common
-from ..asset import AppriseAsset
-from ..url import URLBase
+from ..AppriseAsset import AppriseAsset
+from ..URLBase import URLBase
+from ..ConfigurationManager import ConfigurationManager
from ..utils import GET_SCHEMA_RE
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import parse_urls
from ..utils import cwe312_url
-from ..manager_config import ConfigurationManager
-from ..manager_plugins import NotificationManager
+from ..NotificationManager import NotificationManager
# Test whether token is valid or not
VALID_TOKEN = re.compile(
diff --git a/libs/apprise/config/base.pyi b/libs/apprise/config/ConfigBase.pyi
index abff1204d..abff1204d 100644
--- a/libs/apprise/config/base.pyi
+++ b/libs/apprise/config/ConfigBase.pyi
diff --git a/libs/apprise/config/file.py b/libs/apprise/config/ConfigFile.py
index 9f29ca20b..172d699f8 100644
--- a/libs/apprise/config/file.py
+++ b/libs/apprise/config/ConfigFile.py
@@ -28,10 +28,10 @@
import re
import os
-from .base import ConfigBase
+from .ConfigBase import ConfigBase
from ..common import ConfigFormat
from ..common import ContentIncludeMode
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class ConfigFile(ConfigBase):
diff --git a/libs/apprise/config/http.py b/libs/apprise/config/ConfigHTTP.py
index 2e2ba299b..f6faba8d4 100644
--- a/libs/apprise/config/http.py
+++ b/libs/apprise/config/ConfigHTTP.py
@@ -28,11 +28,11 @@
import re
import requests
-from .base import ConfigBase
+from .ConfigBase import ConfigBase
from ..common import ConfigFormat
from ..common import ContentIncludeMode
-from ..url import PrivacyMode
-from ..locale import gettext_lazy as _
+from ..URLBase import PrivacyMode
+from ..AppriseLocale import gettext_lazy as _
# Support YAML formats
# text/yaml
diff --git a/libs/apprise/config/memory.py b/libs/apprise/config/ConfigMemory.py
index 181d76236..413956dfc 100644
--- a/libs/apprise/config/memory.py
+++ b/libs/apprise/config/ConfigMemory.py
@@ -26,8 +26,8 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-from .base import ConfigBase
-from ..locale import gettext_lazy as _
+from .ConfigBase import ConfigBase
+from ..AppriseLocale import gettext_lazy as _
class ConfigMemory(ConfigBase):
diff --git a/libs/apprise/config/__init__.py b/libs/apprise/config/__init__.py
index 24957e88e..efbace687 100644
--- a/libs/apprise/config/__init__.py
+++ b/libs/apprise/config/__init__.py
@@ -27,8 +27,8 @@
# POSSIBILITY OF SUCH DAMAGE.
# Used for testing
-from .base import ConfigBase
-from ..manager_config import ConfigurationManager
+from .ConfigBase import ConfigBase
+from ..ConfigurationManager import ConfigurationManager
# Initalize our Config Manager Singleton
C_MGR = ConfigurationManager()
@@ -36,5 +36,4 @@ C_MGR = ConfigurationManager()
__all__ = [
# Reference
'ConfigBase',
- 'ConfigurationManager',
]
diff --git a/libs/apprise/conversion.py b/libs/apprise/conversion.py
index 5b6d1a941..4d5632f59 100644
--- a/libs/apprise/conversion.py
+++ b/libs/apprise/conversion.py
@@ -29,7 +29,7 @@
import re
from markdown import markdown
from .common import NotifyFormat
-from .url import URLBase
+from .URLBase import URLBase
from html.parser import HTMLParser
diff --git a/libs/apprise/decorators/base.py b/libs/apprise/decorators/CustomNotifyPlugin.py
index 2661db0aa..eb5f17b78 100644
--- a/libs/apprise/decorators/base.py
+++ b/libs/apprise/decorators/CustomNotifyPlugin.py
@@ -27,8 +27,8 @@
# POSSIBILITY OF SUCH DAMAGE.USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-from ..plugins.base import NotifyBase
-from ..manager_plugins import NotificationManager
+from ..plugins.NotifyBase import NotifyBase
+from ..NotificationManager import NotificationManager
from ..utils import URL_DETAILS_RE
from ..utils import parse_url
from ..utils import url_assembly
@@ -55,9 +55,6 @@ class CustomNotifyPlugin(NotifyBase):
# should be treated differently.
category = 'custom'
- # Support Attachments
- attachment_support = True
-
# Define object templates
templates = (
'{schema}://',
diff --git a/libs/apprise/decorators/notify.py b/libs/apprise/decorators/notify.py
index 892c3adfe..2dd5f5099 100644
--- a/libs/apprise/decorators/notify.py
+++ b/libs/apprise/decorators/notify.py
@@ -26,7 +26,7 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-from .base import CustomNotifyPlugin
+from .CustomNotifyPlugin import CustomNotifyPlugin
def notify(on, name=None):
diff --git a/libs/apprise/i18n/en/LC_MESSAGES/apprise.mo b/libs/apprise/i18n/en/LC_MESSAGES/apprise.mo
index f108b538d..1d22b89a6 100644
--- a/libs/apprise/i18n/en/LC_MESSAGES/apprise.mo
+++ b/libs/apprise/i18n/en/LC_MESSAGES/apprise.mo
Binary files differ
diff --git a/libs/apprise/manager.py b/libs/apprise/manager.py
index 70dc10700..c2b715d4f 100644
--- a/libs/apprise/manager.py
+++ b/libs/apprise/manager.py
@@ -61,9 +61,6 @@ class PluginManager(metaclass=Singleton):
# The module path to scan
module_path = join(abspath(dirname(__file__)), _id)
- # For filtering our result when scanning a module
- module_filter_re = re.compile(r'^(?P<name>((?!_)[A-Za-z0-9]+))$')
-
# thread safe loading
_lock = threading.Lock()
@@ -180,7 +177,7 @@ class PluginManager(metaclass=Singleton):
# The .py extension is optional as we support loading directories
# too
module_re = re.compile(
- r'^(?P<name>(?!base|_)[a-z0-9_]+)(\.py)?$',
+ r'^(?P<name>' + self.fname_prefix + r'[a-z0-9]+)(\.py)?$',
re.I)
t_start = time.time()
@@ -191,6 +188,10 @@ class PluginManager(metaclass=Singleton):
# keep going
continue
+ elif match.group('name') == f'{self.fname_prefix}Base':
+ # keep going
+ continue
+
# Store our notification/plugin name:
module_name = match.group('name')
module_pyname = '{}.{}'.format(module_name_prefix, module_name)
@@ -215,47 +216,7 @@ class PluginManager(metaclass=Singleton):
# logging found in import_module and not needed here
continue
- module_class = None
- for m_class in [obj for obj in dir(module)
- if self.module_filter_re.match(obj)]:
- # Get our plugin
- plugin = getattr(module, m_class)
- if not hasattr(plugin, 'app_id'):
- # Filter out non-notification modules
- logger.trace(
- "(%s) import failed; no app_id defined in %s",
- self.name, m_class, os.path.join(module_path, f))
- continue
-
- # Add our plugin name to our module map
- self._module_map[module_name] = {
- 'plugin': set([plugin]),
- 'module': module,
- 'path': '{}.{}'.format(
- module_name_prefix, module_name),
- 'native': True,
- }
-
- fn = getattr(plugin, 'schemas', None)
- schemas = set([]) if not callable(fn) else fn(plugin)
-
- # map our schema to our plugin
- for schema in schemas:
- if schema in self._schema_map:
- logger.error(
- "{} schema ({}) mismatch detected - {} to {}"
- .format(self.name, schema, self._schema_map,
- plugin))
- continue
-
- # Assign plugin
- self._schema_map[schema] = plugin
-
- # Store our class
- module_class = m_class
- break
-
- if not module_class:
+ if not hasattr(module, module_name):
# Not a library we can load as it doesn't follow the simple
# rule that the class must bear the same name as the
# notification file itself.
@@ -265,6 +226,38 @@ class PluginManager(metaclass=Singleton):
self.name, module_name, os.path.join(module_path, f))
continue
+ # Get our plugin
+ plugin = getattr(module, module_name)
+ if not hasattr(plugin, 'app_id'):
+ # Filter out non-notification modules
+ logger.trace(
+ "(%s) import failed; no app_id defined in %s",
+ self.name, module_name, os.path.join(module_path, f))
+ continue
+
+ # Add our plugin name to our module map
+ self._module_map[module_name] = {
+ 'plugin': set([plugin]),
+ 'module': module,
+ 'path': '{}.{}'.format(module_name_prefix, module_name),
+ 'native': True,
+ }
+
+ fn = getattr(plugin, 'schemas', None)
+ schemas = set([]) if not callable(fn) else fn(plugin)
+
+ # map our schema to our plugin
+ for schema in schemas:
+ if schema in self._schema_map:
+ logger.error(
+ "{} schema ({}) mismatch detected - {} to {}"
+ .format(self.name, schema, self._schema_map,
+ plugin))
+ continue
+
+ # Assign plugin
+ self._schema_map[schema] = plugin
+
logger.trace(
'{} {} loaded in {:.6f}s'.format(
self.name, module_name, (time.time() - tl_start)))
diff --git a/libs/apprise/plugins/apprise_api.py b/libs/apprise/plugins/NotifyAppriseAPI.py
index fd71236b5..34c34a6d4 100644
--- a/libs/apprise/plugins/apprise_api.py
+++ b/libs/apprise/plugins/NotifyAppriseAPI.py
@@ -31,12 +31,12 @@ import requests
from json import dumps
import base64
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class AppriseAPIMethod:
@@ -123,7 +123,7 @@ class NotifyAppriseAPI(NotifyBase):
'type': 'string',
'required': True,
'private': True,
- 'regex': (r'^[A-Z0-9_-]{1,128}$', 'i'),
+ 'regex': (r'^[A-Z0-9_-]{1,32}$', 'i'),
},
})
diff --git a/libs/apprise/plugins/aprs.py b/libs/apprise/plugins/NotifyAprs.py
index b8adef5aa..5d8c3c100 100644
--- a/libs/apprise/plugins/aprs.py
+++ b/libs/apprise/plugins/NotifyAprs.py
@@ -70,9 +70,9 @@
import socket
import sys
from itertools import chain
-from .base import NotifyBase
-from ..locale import gettext_lazy as _
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..AppriseLocale import gettext_lazy as _
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_call_sign
from ..utils import parse_call_sign
diff --git a/libs/apprise/plugins/bark.py b/libs/apprise/plugins/NotifyBark.py
index e2f5bbfb4..781a1515e 100644
--- a/libs/apprise/plugins/bark.py
+++ b/libs/apprise/plugins/NotifyBark.py
@@ -32,13 +32,13 @@
import requests
import json
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_list
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Sounds generated off of: https://github.com/Finb/Bark/tree/master/Sounds
diff --git a/libs/apprise/plugins/base.py b/libs/apprise/plugins/NotifyBase.py
index 1abc3410e..c29417c60 100644
--- a/libs/apprise/plugins/base.py
+++ b/libs/apprise/plugins/NotifyBase.py
@@ -30,7 +30,7 @@ import asyncio
import re
from functools import partial
-from ..url import URLBase
+from ..URLBase import URLBase
from ..common import NotifyType
from ..utils import parse_bool
from ..common import NOTIFY_TYPES
@@ -38,8 +38,8 @@ from ..common import NotifyFormat
from ..common import NOTIFY_FORMATS
from ..common import OverflowMode
from ..common import OVERFLOW_MODES
-from ..locale import gettext_lazy as _
-from ..apprise_attachment import AppriseAttachment
+from ..AppriseLocale import gettext_lazy as _
+from ..AppriseAttachment import AppriseAttachment
class NotifyBase(URLBase):
diff --git a/libs/apprise/plugins/base.pyi b/libs/apprise/plugins/NotifyBase.pyi
index 9cf3e404c..9cf3e404c 100644
--- a/libs/apprise/plugins/base.pyi
+++ b/libs/apprise/plugins/NotifyBase.pyi
diff --git a/libs/apprise/plugins/boxcar.py b/libs/apprise/plugins/NotifyBoxcar.py
index 851cdd3d8..808920ed5 100644
--- a/libs/apprise/plugins/boxcar.py
+++ b/libs/apprise/plugins/NotifyBoxcar.py
@@ -35,14 +35,14 @@ from hashlib import sha1
from itertools import chain
from urllib.parse import urlparse
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..utils import parse_bool
from ..utils import parse_list
from ..utils import validate_regex
from ..common import NotifyType
from ..common import NotifyImageSize
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Default to sending to all devices if nothing is specified
DEFAULT_TAG = '@all'
diff --git a/libs/apprise/plugins/bulksms.py b/libs/apprise/plugins/NotifyBulkSMS.py
index 29c4d7fac..33664fb00 100644
--- a/libs/apprise/plugins/bulksms.py
+++ b/libs/apprise/plugins/NotifyBulkSMS.py
@@ -36,13 +36,13 @@ import re
import requests
import json
from itertools import chain
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
IS_GROUP_RE = re.compile(
diff --git a/libs/apprise/plugins/bulkvs.py b/libs/apprise/plugins/NotifyBulkVS.py
index 53a363008..e912dff25 100644
--- a/libs/apprise/plugins/bulkvs.py
+++ b/libs/apprise/plugins/NotifyBulkVS.py
@@ -35,13 +35,13 @@
# Messaging/post_messageSend
import requests
import json
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyBulkVS(NotifyBase):
diff --git a/libs/apprise/plugins/burstsms.py b/libs/apprise/plugins/NotifyBurstSMS.py
index eb19df8e4..39606abba 100644
--- a/libs/apprise/plugins/burstsms.py
+++ b/libs/apprise/plugins/NotifyBurstSMS.py
@@ -33,14 +33,14 @@
#
import requests
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class BurstSMSCountryCode:
diff --git a/libs/apprise/plugins/chantify.py b/libs/apprise/plugins/NotifyChantify.py
index d549a59fa..d912bd257 100644
--- a/libs/apprise/plugins/chantify.py
+++ b/libs/apprise/plugins/NotifyChantify.py
@@ -35,10 +35,10 @@
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyChantify(NotifyBase):
diff --git a/libs/apprise/plugins/clicksend.py b/libs/apprise/plugins/NotifyClickSend.py
index 9ade1055e..5e345fe10 100644
--- a/libs/apprise/plugins/clicksend.py
+++ b/libs/apprise/plugins/NotifyClickSend.py
@@ -41,14 +41,15 @@
#
import requests
from json import dumps
+from base64 import b64encode
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
CLICKSEND_HTTP_ERROR_MAP = {
@@ -88,7 +89,7 @@ class NotifyClickSend(NotifyBase):
# Define object templates
templates = (
- '{schema}://{user}:{apikey}@{targets}',
+ '{schema}://{user}:{password}@{targets}',
)
# Define our template tokens
@@ -98,12 +99,11 @@ class NotifyClickSend(NotifyBase):
'type': 'string',
'required': True,
},
- 'apikey': {
- 'name': _('API Key'),
+ 'password': {
+ 'name': _('Password'),
'type': 'string',
'private': True,
'required': True,
- 'map_to': 'password',
},
'target_phone': {
'name': _('Target Phone No'),
@@ -124,9 +124,6 @@ class NotifyClickSend(NotifyBase):
'to': {
'alias_of': 'targets',
},
- 'key': {
- 'alias_of': 'apikey',
- },
'batch': {
'name': _('Batch Mode'),
'type': 'bool',
@@ -177,6 +174,9 @@ class NotifyClickSend(NotifyBase):
headers = {
'User-Agent': self.app_id,
'Content-Type': 'application/json; charset=utf-8',
+ 'Authorization': 'Basic {}'.format(
+ b64encode('{}:{}'.format(
+ self.user, self.password).encode('utf-8'))),
}
# error tracking (used for function return)
@@ -208,7 +208,6 @@ class NotifyClickSend(NotifyBase):
r = requests.post(
self.notify_url,
data=dumps(payload),
- auth=(self.user, self.password),
headers=headers,
verify=self.verify_certificate,
timeout=self.request_timeout,
@@ -323,12 +322,6 @@ class NotifyClickSend(NotifyBase):
results['batch'] = \
parse_bool(results['qsd'].get('batch', False))
- # API Key
- if 'key' in results['qsd'] and len(results['qsd']['key']):
- # Extract the API Key from an argument
- results['password'] = \
- NotifyClickSend.unquote(results['qsd']['key'])
-
# Support the 'to' variable so that we can support rooms this way too
# The 'to' makes it easier to use yaml configuration
if 'to' in results['qsd'] and len(results['qsd']['to']):
diff --git a/libs/apprise/plugins/d7networks.py b/libs/apprise/plugins/NotifyD7Networks.py
index ad55e2197..906ec2fb9 100644
--- a/libs/apprise/plugins/d7networks.py
+++ b/libs/apprise/plugins/NotifyD7Networks.py
@@ -39,13 +39,13 @@ import requests
from json import dumps
from json import loads
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import validate_regex
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
D7NETWORKS_HTTP_ERROR_MAP = {
diff --git a/libs/apprise/plugins/dbus.py b/libs/apprise/plugins/NotifyDBus.py
index f2361fd62..52e119813 100644
--- a/libs/apprise/plugins/dbus.py
+++ b/libs/apprise/plugins/NotifyDBus.py
@@ -27,11 +27,11 @@
# POSSIBILITY OF SUCH DAMAGE.
import sys
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Default our global support flag
NOTIFY_DBUS_SUPPORT_ENABLED = False
diff --git a/libs/apprise/plugins/dapnet.py b/libs/apprise/plugins/NotifyDapnet.py
index 60a18acd4..ae7199c94 100644
--- a/libs/apprise/plugins/dapnet.py
+++ b/libs/apprise/plugins/NotifyDapnet.py
@@ -51,9 +51,9 @@ from json import dumps
import requests
from requests.auth import HTTPBasicAuth
-from .base import NotifyBase
-from ..locale import gettext_lazy as _
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..AppriseLocale import gettext_lazy as _
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_call_sign
from ..utils import parse_call_sign
diff --git a/libs/apprise/plugins/dingtalk.py b/libs/apprise/plugins/NotifyDingTalk.py
index 2ca1bc55b..d4a492fc7 100644
--- a/libs/apprise/plugins/dingtalk.py
+++ b/libs/apprise/plugins/NotifyDingTalk.py
@@ -34,13 +34,13 @@ import base64
import requests
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Register at https://dingtalk.com
# - Download their PC based software as it is the only way you can create
diff --git a/libs/apprise/plugins/discord.py b/libs/apprise/plugins/NotifyDiscord.py
index 14c6152ba..82d764f50 100644
--- a/libs/apprise/plugins/discord.py
+++ b/libs/apprise/plugins/NotifyDiscord.py
@@ -50,14 +50,14 @@ from datetime import timedelta
from datetime import datetime
from datetime import timezone
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
-from ..attachment.base import AttachBase
+from ..AppriseLocale import gettext_lazy as _
+from ..attachment.AttachBase import AttachBase
# Used to detect user/role IDs
diff --git a/libs/apprise/plugins/email.py b/libs/apprise/plugins/NotifyEmail.py
index 142c93cfb..80f88bf61 100644
--- a/libs/apprise/plugins/email.py
+++ b/libs/apprise/plugins/NotifyEmail.py
@@ -41,12 +41,12 @@ from socket import error as SocketError
from datetime import datetime
from datetime import timezone
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyFormat, NotifyType
from ..conversion import convert_between
-from ..utils import is_ipaddr, is_email, parse_emails, is_hostname
-from ..locale import gettext_lazy as _
+from ..utils import is_email, parse_emails, is_hostname
+from ..AppriseLocale import gettext_lazy as _
from ..logger import logger
# Globally Default encoding mode set to Quoted Printable.
@@ -1053,12 +1053,8 @@ class NotifyEmail(NotifyBase):
# Prepare our target lists
results['targets'] = []
- if is_ipaddr(results['host']):
- # Silently move on and do not disrupt any configuration
- pass
-
- elif not is_hostname(results['host'], ipv4=False, ipv6=False,
- underscore=False):
+ if not is_hostname(results['host'], ipv4=False, ipv6=False,
+ underscore=False):
if is_email(NotifyEmail.unquote(results['host'])):
# Don't lose defined email addresses
diff --git a/libs/apprise/plugins/emby.py b/libs/apprise/plugins/NotifyEmby.py
index 5e4e0b89f..ce96553a2 100644
--- a/libs/apprise/plugins/emby.py
+++ b/libs/apprise/plugins/NotifyEmby.py
@@ -34,12 +34,12 @@ import hashlib
from json import dumps
from json import loads
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..utils import parse_bool
from ..common import NotifyType
from .. import __version__ as VERSION
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyEmby(NotifyBase):
diff --git a/libs/apprise/plugins/enigma2.py b/libs/apprise/plugins/NotifyEnigma2.py
index 8b1fff687..313149993 100644
--- a/libs/apprise/plugins/enigma2.py
+++ b/libs/apprise/plugins/NotifyEnigma2.py
@@ -37,10 +37,10 @@
import requests
from json import loads
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class Enigma2MessageType:
diff --git a/libs/apprise/plugins/fcm/__init__.py b/libs/apprise/plugins/NotifyFCM/__init__.py
index 9dc0679f1..54b6c9cc7 100644
--- a/libs/apprise/plugins/fcm/__init__.py
+++ b/libs/apprise/plugins/NotifyFCM/__init__.py
@@ -50,15 +50,15 @@
# You will need this in order to send an apprise messag
import requests
from json import dumps
-from ..base import NotifyBase
+from ..NotifyBase import NotifyBase
from ...common import NotifyType
from ...utils import validate_regex
from ...utils import parse_list
from ...utils import parse_bool
from ...utils import dict_full_update
from ...common import NotifyImageSize
-from ...apprise_attachment import AppriseAttachment
-from ...locale import gettext_lazy as _
+from ...AppriseAttachment import AppriseAttachment
+from ...AppriseLocale import gettext_lazy as _
from .common import (FCMMode, FCM_MODES)
from .priority import (FCM_PRIORITIES, FCMPriorityManager)
from .color import FCMColorManager
diff --git a/libs/apprise/plugins/fcm/color.py b/libs/apprise/plugins/NotifyFCM/color.py
index 20149eedd..c7da209a7 100644
--- a/libs/apprise/plugins/fcm/color.py
+++ b/libs/apprise/plugins/NotifyFCM/color.py
@@ -36,7 +36,7 @@
import re
from ...utils import parse_bool
from ...common import NotifyType
-from ...asset import AppriseAsset
+from ...AppriseAsset import AppriseAsset
class FCMColorManager:
diff --git a/libs/apprise/plugins/fcm/common.py b/libs/apprise/plugins/NotifyFCM/common.py
index 9f139226a..9f139226a 100644
--- a/libs/apprise/plugins/fcm/common.py
+++ b/libs/apprise/plugins/NotifyFCM/common.py
diff --git a/libs/apprise/plugins/fcm/oauth.py b/libs/apprise/plugins/NotifyFCM/oauth.py
index fbde3ccf7..fbde3ccf7 100644
--- a/libs/apprise/plugins/fcm/oauth.py
+++ b/libs/apprise/plugins/NotifyFCM/oauth.py
diff --git a/libs/apprise/plugins/fcm/priority.py b/libs/apprise/plugins/NotifyFCM/priority.py
index 8564d3460..8564d3460 100644
--- a/libs/apprise/plugins/fcm/priority.py
+++ b/libs/apprise/plugins/NotifyFCM/priority.py
diff --git a/libs/apprise/plugins/feishu.py b/libs/apprise/plugins/NotifyFeishu.py
index 961523bab..e6988333c 100644
--- a/libs/apprise/plugins/feishu.py
+++ b/libs/apprise/plugins/NotifyFeishu.py
@@ -36,10 +36,10 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyFeishu(NotifyBase):
diff --git a/libs/apprise/plugins/flock.py b/libs/apprise/plugins/NotifyFlock.py
index bf2cd131d..f1d12067e 100644
--- a/libs/apprise/plugins/flock.py
+++ b/libs/apprise/plugins/NotifyFlock.py
@@ -44,14 +44,14 @@ import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyFormat
from ..common import NotifyImageSize
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
diff --git a/libs/apprise/plugins/custom_form.py b/libs/apprise/plugins/NotifyForm.py
index 0f36643f7..9690cd4f5 100644
--- a/libs/apprise/plugins/custom_form.py
+++ b/libs/apprise/plugins/NotifyForm.py
@@ -29,11 +29,11 @@
import re
import requests
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyImageSize
from ..common import NotifyType
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class FORMPayloadField:
diff --git a/libs/apprise/plugins/freemobile.py b/libs/apprise/plugins/NotifyFreeMobile.py
index 4ff3d4822..4aad8db3d 100644
--- a/libs/apprise/plugins/freemobile.py
+++ b/libs/apprise/plugins/NotifyFreeMobile.py
@@ -36,9 +36,9 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyFreeMobile(NotifyBase):
@@ -126,7 +126,6 @@ class NotifyFreeMobile(NotifyBase):
# prepare our headers
headers = {
'User-Agent': self.app_id,
- 'Content-Type': 'application/json',
}
# Prepare our payload
diff --git a/libs/apprise/plugins/gnome.py b/libs/apprise/plugins/NotifyGnome.py
index b64b51304..67129216d 100644
--- a/libs/apprise/plugins/gnome.py
+++ b/libs/apprise/plugins/NotifyGnome.py
@@ -26,11 +26,11 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Default our global support flag
NOTIFY_GNOME_SUPPORT_ENABLED = False
diff --git a/libs/apprise/plugins/google_chat.py b/libs/apprise/plugins/NotifyGoogleChat.py
index f30cdae49..d2a6cc8a8 100644
--- a/libs/apprise/plugins/google_chat.py
+++ b/libs/apprise/plugins/NotifyGoogleChat.py
@@ -58,11 +58,11 @@ import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyGoogleChat(NotifyBase):
diff --git a/libs/apprise/plugins/gotify.py b/libs/apprise/plugins/NotifyGotify.py
index bf6c1b281..3f4ce132d 100644
--- a/libs/apprise/plugins/gotify.py
+++ b/libs/apprise/plugins/NotifyGotify.py
@@ -34,10 +34,10 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType, NotifyFormat
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Priorities
diff --git a/libs/apprise/plugins/growl.py b/libs/apprise/plugins/NotifyGrowl.py
index 0b3672188..0b42e3bec 100644
--- a/libs/apprise/plugins/growl.py
+++ b/libs/apprise/plugins/NotifyGrowl.py
@@ -26,12 +26,12 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Default our global support flag
NOTIFY_GROWL_SUPPORT_ENABLED = False
diff --git a/libs/apprise/plugins/guilded.py b/libs/apprise/plugins/NotifyGuilded.py
index 0ee07018e..0ea36d9f8 100644
--- a/libs/apprise/plugins/guilded.py
+++ b/libs/apprise/plugins/NotifyGuilded.py
@@ -45,11 +45,10 @@
#
import re
-# Import namespace so the class won't conflict with the actual Notify object
-from . import discord
+from .NotifyDiscord import NotifyDiscord
-class NotifyGuilded(discord.NotifyDiscord):
+class NotifyGuilded(NotifyDiscord):
"""
A wrapper to Guilded Notifications
diff --git a/libs/apprise/plugins/home_assistant.py b/libs/apprise/plugins/NotifyHomeAssistant.py
index b0ffcaa64..0829381b9 100644
--- a/libs/apprise/plugins/home_assistant.py
+++ b/libs/apprise/plugins/NotifyHomeAssistant.py
@@ -34,11 +34,11 @@ from json import dumps
from uuid import uuid4
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyHomeAssistant(NotifyBase):
diff --git a/libs/apprise/plugins/httpsms.py b/libs/apprise/plugins/NotifyHttpSMS.py
index b36e286d7..647100949 100644
--- a/libs/apprise/plugins/httpsms.py
+++ b/libs/apprise/plugins/NotifyHttpSMS.py
@@ -31,12 +31,12 @@
# https://httpsms.com
import requests
import json
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyHttpSMS(NotifyBase):
diff --git a/libs/apprise/plugins/ifttt.py b/libs/apprise/plugins/NotifyIFTTT.py
index 9d89b1464..9174640d0 100644
--- a/libs/apprise/plugins/ifttt.py
+++ b/libs/apprise/plugins/NotifyIFTTT.py
@@ -44,11 +44,11 @@ import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyIFTTT(NotifyBase):
diff --git a/libs/apprise/plugins/custom_json.py b/libs/apprise/plugins/NotifyJSON.py
index e0d7a6753..182ff77cf 100644
--- a/libs/apprise/plugins/custom_json.py
+++ b/libs/apprise/plugins/NotifyJSON.py
@@ -30,11 +30,11 @@ import requests
import base64
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyImageSize
from ..common import NotifyType
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class JSONPayloadField:
diff --git a/libs/apprise/plugins/join.py b/libs/apprise/plugins/NotifyJoin.py
index b92bb37a3..c6b0d91e9 100644
--- a/libs/apprise/plugins/join.py
+++ b/libs/apprise/plugins/NotifyJoin.py
@@ -39,13 +39,13 @@
import re
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
JOIN_HTTP_ERROR_MAP = {
diff --git a/libs/apprise/plugins/kavenegar.py b/libs/apprise/plugins/NotifyKavenegar.py
index e4963f409..2a9c169d7 100644
--- a/libs/apprise/plugins/kavenegar.py
+++ b/libs/apprise/plugins/NotifyKavenegar.py
@@ -38,12 +38,12 @@
import requests
from json import loads
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
# Based on https://kavenegar.com/rest.html
diff --git a/libs/apprise/plugins/kumulos.py b/libs/apprise/plugins/NotifyKumulos.py
index 504dcc379..da372e773 100644
--- a/libs/apprise/plugins/kumulos.py
+++ b/libs/apprise/plugins/NotifyKumulos.py
@@ -39,10 +39,10 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
KUMULOS_HTTP_ERROR_MAP = {
diff --git a/libs/apprise/plugins/lametric.py b/libs/apprise/plugins/NotifyLametric.py
index 411b9ea21..5825d9176 100644
--- a/libs/apprise/plugins/lametric.py
+++ b/libs/apprise/plugins/NotifyLametric.py
@@ -90,10 +90,10 @@
import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
from ..utils import is_hostname
from ..utils import is_ipaddr
diff --git a/libs/apprise/plugins/line.py b/libs/apprise/plugins/NotifyLine.py
index 07a01e769..61e4f3703 100644
--- a/libs/apprise/plugins/line.py
+++ b/libs/apprise/plugins/NotifyLine.py
@@ -33,14 +33,14 @@ import requests
import re
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..common import NotifyImageSize
from ..utils import validate_regex
from ..utils import parse_list
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Used to break path apart into list of streams
diff --git a/libs/apprise/plugins/lunasea.py b/libs/apprise/plugins/NotifyLunaSea.py
index 2af519179..51d820915 100644
--- a/libs/apprise/plugins/lunasea.py
+++ b/libs/apprise/plugins/NotifyLunaSea.py
@@ -33,15 +33,15 @@ import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyImageSize
from ..utils import parse_list
from ..utils import is_hostname
from ..utils import is_ipaddr
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
-from ..url import PrivacyMode
+from ..AppriseLocale import gettext_lazy as _
+from ..URLBase import PrivacyMode
class LunaSeaMode:
diff --git a/libs/apprise/plugins/mqtt.py b/libs/apprise/plugins/NotifyMQTT.py
index 1e09cd147..49380d330 100644
--- a/libs/apprise/plugins/mqtt.py
+++ b/libs/apprise/plugins/NotifyMQTT.py
@@ -38,12 +38,12 @@ import re
from time import sleep
from datetime import datetime
from os.path import isfile
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import parse_list
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Default our global support flag
NOTIFY_MQTT_SUPPORT_ENABLED = False
diff --git a/libs/apprise/plugins/msg91.py b/libs/apprise/plugins/NotifyMSG91.py
index 28a5bf183..a7bd9c473 100644
--- a/libs/apprise/plugins/msg91.py
+++ b/libs/apprise/plugins/NotifyMSG91.py
@@ -38,12 +38,12 @@
import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no, parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class MSG91PayloadField:
diff --git a/libs/apprise/plugins/msteams.py b/libs/apprise/plugins/NotifyMSTeams.py
index 2e0957f32..06572c3e6 100644
--- a/libs/apprise/plugins/msteams.py
+++ b/libs/apprise/plugins/NotifyMSTeams.py
@@ -81,7 +81,7 @@ import requests
import json
from json.decoder import JSONDecodeError
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..common import NotifyFormat
@@ -89,8 +89,8 @@ from ..utils import parse_bool
from ..utils import validate_regex
from ..utils import apply_template
from ..utils import TemplateType
-from ..apprise_attachment import AppriseAttachment
-from ..locale import gettext_lazy as _
+from ..AppriseAttachment import AppriseAttachment
+from ..AppriseLocale import gettext_lazy as _
class NotifyMSTeams(NotifyBase):
diff --git a/libs/apprise/plugins/macosx.py b/libs/apprise/plugins/NotifyMacOSX.py
index 31b7101bd..dd53369fe 100644
--- a/libs/apprise/plugins/macosx.py
+++ b/libs/apprise/plugins/NotifyMacOSX.py
@@ -30,11 +30,11 @@ import platform
import subprocess
import os
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Default our global support flag
NOTIFY_MACOSX_SUPPORT_ENABLED = False
diff --git a/libs/apprise/plugins/mailgun.py b/libs/apprise/plugins/NotifyMailgun.py
index 69ab72dda..82cf970bf 100644
--- a/libs/apprise/plugins/mailgun.py
+++ b/libs/apprise/plugins/NotifyMailgun.py
@@ -56,7 +56,7 @@
#
import requests
from email.utils import formataddr
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyFormat
from ..utils import parse_emails
@@ -64,7 +64,7 @@ from ..utils import parse_bool
from ..utils import is_email
from ..utils import validate_regex
from ..logger import logger
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Provide some known codes Mailgun uses and what they translate to:
# Based on https://documentation.mailgun.com/en/latest/api-intro.html#errors
diff --git a/libs/apprise/plugins/mastodon.py b/libs/apprise/plugins/NotifyMastodon.py
index b6e451ad1..0d2f27df3 100644
--- a/libs/apprise/plugins/mastodon.py
+++ b/libs/apprise/plugins/NotifyMastodon.py
@@ -33,16 +33,16 @@ from json import dumps, loads
from datetime import datetime
from datetime import timezone
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyImageSize
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
-from ..attachment.base import AttachBase
+from ..AppriseLocale import gettext_lazy as _
+from ..attachment.AttachBase import AttachBase
# Accept:
# - @username
diff --git a/libs/apprise/plugins/matrix.py b/libs/apprise/plugins/NotifyMatrix.py
index c1401f238..594274761 100644
--- a/libs/apprise/plugins/matrix.py
+++ b/libs/apprise/plugins/NotifyMatrix.py
@@ -37,8 +37,8 @@ from json import dumps
from json import loads
from time import time
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..common import NotifyImageSize
from ..common import NotifyFormat
@@ -46,7 +46,7 @@ from ..utils import parse_bool
from ..utils import parse_list
from ..utils import is_hostname
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Define default path
MATRIX_V1_WEBHOOK_PATH = '/api/v1/matrix/hook'
diff --git a/libs/apprise/plugins/mattermost.py b/libs/apprise/plugins/NotifyMattermost.py
index 481a9b852..dbb5f0dd3 100644
--- a/libs/apprise/plugins/mattermost.py
+++ b/libs/apprise/plugins/NotifyMattermost.py
@@ -39,13 +39,13 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_bool
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Some Reference Locations:
# - https://docs.mattermost.com/developer/webhooks-incoming.html
diff --git a/libs/apprise/plugins/messagebird.py b/libs/apprise/plugins/NotifyMessageBird.py
index c496d347e..42d880acd 100644
--- a/libs/apprise/plugins/messagebird.py
+++ b/libs/apprise/plugins/NotifyMessageBird.py
@@ -34,12 +34,12 @@
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyMessageBird(NotifyBase):
diff --git a/libs/apprise/plugins/misskey.py b/libs/apprise/plugins/NotifyMisskey.py
index 73b8f7c6e..8965a0f7b 100644
--- a/libs/apprise/plugins/misskey.py
+++ b/libs/apprise/plugins/NotifyMisskey.py
@@ -47,10 +47,10 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class MisskeyVisibility:
diff --git a/libs/apprise/plugins/nextcloud.py b/libs/apprise/plugins/NotifyNextcloud.py
index 9acfc43d5..fd471d9eb 100644
--- a/libs/apprise/plugins/nextcloud.py
+++ b/libs/apprise/plugins/NotifyNextcloud.py
@@ -28,11 +28,11 @@
import requests
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import parse_list
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyNextcloud(NotifyBase):
diff --git a/libs/apprise/plugins/nextcloudtalk.py b/libs/apprise/plugins/NotifyNextcloudTalk.py
index b1b014770..4bfced282 100644
--- a/libs/apprise/plugins/nextcloudtalk.py
+++ b/libs/apprise/plugins/NotifyNextcloudTalk.py
@@ -29,11 +29,11 @@
import requests
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import parse_list
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyNextcloudTalk(NotifyBase):
diff --git a/libs/apprise/plugins/notica.py b/libs/apprise/plugins/NotifyNotica.py
index 661fde1d1..33a94fc96 100644
--- a/libs/apprise/plugins/notica.py
+++ b/libs/apprise/plugins/NotifyNotica.py
@@ -43,11 +43,11 @@
import re
import requests
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NoticaMode:
diff --git a/libs/apprise/plugins/notifiarr.py b/libs/apprise/plugins/NotifyNotifiarr.py
index cc13e1a56..e195cbd32 100644
--- a/libs/apprise/plugins/notifiarr.py
+++ b/libs/apprise/plugins/NotifyNotifiarr.py
@@ -31,9 +31,9 @@ import requests
from json import dumps
from itertools import chain
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
from ..common import NotifyImageSize
from ..utils import parse_list, parse_bool
from ..utils import validate_regex
diff --git a/libs/apprise/plugins/notifico.py b/libs/apprise/plugins/NotifyNotifico.py
index 5cb0d666e..27ce29a6e 100644
--- a/libs/apprise/plugins/notifico.py
+++ b/libs/apprise/plugins/NotifyNotifico.py
@@ -44,11 +44,11 @@
import re
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotificoFormat:
diff --git a/libs/apprise/plugins/ntfy.py b/libs/apprise/plugins/NotifyNtfy.py
index 805b87260..40834eece 100644
--- a/libs/apprise/plugins/ntfy.py
+++ b/libs/apprise/plugins/NotifyNtfy.py
@@ -41,18 +41,18 @@ from json import loads
from json import dumps
from os.path import basename
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyFormat
from ..common import NotifyType
from ..common import NotifyImageSize
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import is_hostname
from ..utils import is_ipaddr
from ..utils import validate_regex
-from ..url import PrivacyMode
-from ..attachment.base import AttachBase
+from ..URLBase import PrivacyMode
+from ..attachment.AttachBase import AttachBase
class NtfyMode:
diff --git a/libs/apprise/plugins/office365.py b/libs/apprise/plugins/NotifyOffice365.py
index b04f7a037..0c62279f9 100644
--- a/libs/apprise/plugins/office365.py
+++ b/libs/apprise/plugins/NotifyOffice365.py
@@ -64,14 +64,14 @@ from datetime import datetime
from datetime import timedelta
from json import loads
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import is_email
from ..utils import parse_emails
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyOffice365(NotifyBase):
diff --git a/libs/apprise/plugins/one_signal.py b/libs/apprise/plugins/NotifyOneSignal.py
index 76ec212f4..eb1e10f7a 100644
--- a/libs/apprise/plugins/one_signal.py
+++ b/libs/apprise/plugins/NotifyOneSignal.py
@@ -37,14 +37,14 @@ import requests
from json import dumps
from itertools import chain
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyImageSize
from ..utils import validate_regex
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import is_email
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class OneSignalCategory:
diff --git a/libs/apprise/plugins/opsgenie.py b/libs/apprise/plugins/NotifyOpsgenie.py
index 5327ec803..c2dfed232 100644
--- a/libs/apprise/plugins/opsgenie.py
+++ b/libs/apprise/plugins/NotifyOpsgenie.py
@@ -49,13 +49,13 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
from ..utils import is_uuid
from ..utils import parse_list
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class OpsgenieCategory(NotifyBase):
diff --git a/libs/apprise/plugins/pagerduty.py b/libs/apprise/plugins/NotifyPagerDuty.py
index c9d555527..0896b41b1 100644
--- a/libs/apprise/plugins/pagerduty.py
+++ b/libs/apprise/plugins/NotifyPagerDuty.py
@@ -34,13 +34,13 @@
import requests
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..common import NotifyImageSize
from ..utils import validate_regex
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class PagerDutySeverity:
diff --git a/libs/apprise/plugins/pagertree.py b/libs/apprise/plugins/NotifyPagerTree.py
index 8a041a358..c9290f2f7 100644
--- a/libs/apprise/plugins/pagertree.py
+++ b/libs/apprise/plugins/NotifyPagerTree.py
@@ -31,11 +31,11 @@ from json import dumps
from uuid import uuid4
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Actions
diff --git a/libs/apprise/plugins/parseplatform.py b/libs/apprise/plugins/NotifyParsePlatform.py
index cd59d0575..2a182ed31 100644
--- a/libs/apprise/plugins/parseplatform.py
+++ b/libs/apprise/plugins/NotifyParsePlatform.py
@@ -30,10 +30,10 @@ import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Used to break path apart into list of targets
TARGET_LIST_DELIM = re.compile(r'[ \t\r\n,\\/]+')
diff --git a/libs/apprise/plugins/popcorn_notify.py b/libs/apprise/plugins/NotifyPopcornNotify.py
index 388aa2199..0ecd8af68 100644
--- a/libs/apprise/plugins/popcorn_notify.py
+++ b/libs/apprise/plugins/NotifyPopcornNotify.py
@@ -28,14 +28,14 @@
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_email
from ..utils import is_phone_no
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyPopcornNotify(NotifyBase):
diff --git a/libs/apprise/plugins/prowl.py b/libs/apprise/plugins/NotifyProwl.py
index c174615c0..e5c07bf4e 100644
--- a/libs/apprise/plugins/prowl.py
+++ b/libs/apprise/plugins/NotifyProwl.py
@@ -28,10 +28,10 @@
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Priorities
diff --git a/libs/apprise/plugins/pushbullet.py b/libs/apprise/plugins/NotifyPushBullet.py
index 8e006db1d..5e9c43fbf 100644
--- a/libs/apprise/plugins/pushbullet.py
+++ b/libs/apprise/plugins/NotifyPushBullet.py
@@ -30,13 +30,13 @@ import requests
from json import dumps
from json import loads
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..utils import is_email
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
-from ..attachment.base import AttachBase
+from ..AppriseLocale import gettext_lazy as _
+from ..attachment.AttachBase import AttachBase
# Flag used as a placeholder to sending to all devices
PUSHBULLET_SEND_TO_ALL = 'ALL_DEVICES'
diff --git a/libs/apprise/plugins/pushdeer.py b/libs/apprise/plugins/NotifyPushDeer.py
index fa888b159..6766dc7ff 100644
--- a/libs/apprise/plugins/pushdeer.py
+++ b/libs/apprise/plugins/NotifyPushDeer.py
@@ -29,9 +29,9 @@
import requests
from ..common import NotifyType
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Syntax:
# schan://{key}/
diff --git a/libs/apprise/plugins/pushme.py b/libs/apprise/plugins/NotifyPushMe.py
index abbed7944..30889f868 100644
--- a/libs/apprise/plugins/pushme.py
+++ b/libs/apprise/plugins/NotifyPushMe.py
@@ -28,12 +28,12 @@
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyFormat
from ..utils import validate_regex
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyPushMe(NotifyBase):
diff --git a/libs/apprise/plugins/pushsafer.py b/libs/apprise/plugins/NotifyPushSafer.py
index 7bdca7a69..32cfa82fe 100644
--- a/libs/apprise/plugins/pushsafer.py
+++ b/libs/apprise/plugins/NotifyPushSafer.py
@@ -30,11 +30,11 @@ import base64
import requests
from json import loads
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class PushSaferSound:
diff --git a/libs/apprise/plugins/pushed.py b/libs/apprise/plugins/NotifyPushed.py
index 1ed83b9e4..a50970f99 100644
--- a/libs/apprise/plugins/pushed.py
+++ b/libs/apprise/plugins/NotifyPushed.py
@@ -31,12 +31,12 @@ import requests
from json import dumps
from itertools import chain
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Used to detect and parse channels
IS_CHANNEL = re.compile(r'^#?(?P<name>[A-Za-z0-9]+)$')
diff --git a/libs/apprise/plugins/pushjet.py b/libs/apprise/plugins/NotifyPushjet.py
index f8dcfdf31..253ac6818 100644
--- a/libs/apprise/plugins/pushjet.py
+++ b/libs/apprise/plugins/NotifyPushjet.py
@@ -29,11 +29,11 @@
import requests
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyPushjet(NotifyBase):
diff --git a/libs/apprise/plugins/pushover.py b/libs/apprise/plugins/NotifyPushover.py
index 954e7dd0f..be6ada289 100644
--- a/libs/apprise/plugins/pushover.py
+++ b/libs/apprise/plugins/NotifyPushover.py
@@ -30,14 +30,14 @@ import re
import requests
from itertools import chain
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyFormat
from ..conversion import convert_between
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
-from ..attachment.base import AttachBase
+from ..AppriseLocale import gettext_lazy as _
+from ..attachment.AttachBase import AttachBase
# Flag used as a placeholder to sending to all devices
PUSHOVER_SEND_TO_ALL = 'ALL_DEVICES'
diff --git a/libs/apprise/plugins/pushy.py b/libs/apprise/plugins/NotifyPushy.py
index bb2a24ecd..097017dac 100644
--- a/libs/apprise/plugins/pushy.py
+++ b/libs/apprise/plugins/NotifyPushy.py
@@ -32,11 +32,11 @@ import requests
from itertools import chain
from json import dumps, loads
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Used to detect a Device and Topic
VALIDATE_DEVICE = re.compile(r'^@(?P<device>[a-z0-9]+)$', re.I)
diff --git a/libs/apprise/plugins/rsyslog.py b/libs/apprise/plugins/NotifyRSyslog.py
index 9631c72fd..e39744627 100644
--- a/libs/apprise/plugins/rsyslog.py
+++ b/libs/apprise/plugins/NotifyRSyslog.py
@@ -29,10 +29,10 @@
import os
import socket
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class syslog:
diff --git a/libs/apprise/plugins/reddit.py b/libs/apprise/plugins/NotifyReddit.py
index 3a60b5e03..022a0a50d 100644
--- a/libs/apprise/plugins/reddit.py
+++ b/libs/apprise/plugins/NotifyReddit.py
@@ -53,14 +53,14 @@ from datetime import timedelta
from datetime import datetime
from datetime import timezone
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
from .. import __title__, __version__
# Extend HTTP Error Messages
diff --git a/libs/apprise/plugins/revolt.py b/libs/apprise/plugins/NotifyRevolt.py
index 1f518540b..ae0a43b10 100644
--- a/libs/apprise/plugins/revolt.py
+++ b/libs/apprise/plugins/NotifyRevolt.py
@@ -42,13 +42,13 @@ from datetime import timedelta
from datetime import datetime
from datetime import timezone
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import validate_regex
from ..utils import parse_list
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyRevolt(NotifyBase):
diff --git a/libs/apprise/plugins/rocketchat.py b/libs/apprise/plugins/NotifyRocketChat.py
index 973651e30..9011a5e71 100644
--- a/libs/apprise/plugins/rocketchat.py
+++ b/libs/apprise/plugins/NotifyRocketChat.py
@@ -32,14 +32,14 @@ from json import loads
from json import dumps
from itertools import chain
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyImageSize
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import parse_list
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
IS_CHANNEL = re.compile(r'^#(?P<name>[A-Za-z0-9_-]+)$')
IS_USER = re.compile(r'^@(?P<name>[A-Za-z0-9._-]+)$')
diff --git a/libs/apprise/plugins/ryver.py b/libs/apprise/plugins/NotifyRyver.py
index 114dc6a0c..0872f3e52 100644
--- a/libs/apprise/plugins/ryver.py
+++ b/libs/apprise/plugins/NotifyRyver.py
@@ -38,12 +38,12 @@ import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class RyverWebhookMode:
diff --git a/libs/apprise/plugins/ses.py b/libs/apprise/plugins/NotifySES.py
index 5a2c047a7..b580b14d6 100644
--- a/libs/apprise/plugins/ses.py
+++ b/libs/apprise/plugins/NotifySES.py
@@ -95,13 +95,13 @@ from email.utils import formataddr
from email.header import Header
from urllib.parse import quote
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import parse_emails
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
from ..utils import is_email
# Our Regin Identifier
diff --git a/libs/apprise/plugins/smseagle.py b/libs/apprise/plugins/NotifySMSEagle.py
index 8eddca588..33b4af752 100644
--- a/libs/apprise/plugins/smseagle.py
+++ b/libs/apprise/plugins/NotifySMSEagle.py
@@ -32,14 +32,14 @@ from json import dumps, loads
import base64
from itertools import chain
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import parse_bool
-from ..url import PrivacyMode
-from ..locale import gettext_lazy as _
+from ..URLBase import PrivacyMode
+from ..AppriseLocale import gettext_lazy as _
GROUP_REGEX = re.compile(
diff --git a/libs/apprise/plugins/smsmanager.py b/libs/apprise/plugins/NotifySMSManager.py
index 1d352daf2..efc158b62 100644
--- a/libs/apprise/plugins/smsmanager.py
+++ b/libs/apprise/plugins/NotifySMSManager.py
@@ -35,13 +35,13 @@
# 2. Generate an API key in web administration.
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class SMSManagerGateway(object):
diff --git a/libs/apprise/plugins/smtp2go.py b/libs/apprise/plugins/NotifySMTP2Go.py
index 017da8111..a34492d05 100644
--- a/libs/apprise/plugins/smtp2go.py
+++ b/libs/apprise/plugins/NotifySMTP2Go.py
@@ -49,14 +49,14 @@ import base64
import requests
from json import dumps
from email.utils import formataddr
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyFormat
from ..utils import parse_emails
from ..utils import parse_bool
from ..utils import is_email
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
SMTP2GO_HTTP_ERROR_MAP = {
429: 'To many requests.',
diff --git a/libs/apprise/plugins/sns.py b/libs/apprise/plugins/NotifySNS.py
index cc6e83076..5a287e37e 100644
--- a/libs/apprise/plugins/sns.py
+++ b/libs/apprise/plugins/NotifySNS.py
@@ -36,13 +36,13 @@ from collections import OrderedDict
from xml.etree import ElementTree
from itertools import chain
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Topic Detection
# Summary: 256 Characters max, only alpha/numeric plus underscore (_) and
diff --git a/libs/apprise/plugins/sendgrid.py b/libs/apprise/plugins/NotifySendGrid.py
index d50839f17..b82e3e60d 100644
--- a/libs/apprise/plugins/sendgrid.py
+++ b/libs/apprise/plugins/NotifySendGrid.py
@@ -49,13 +49,13 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import parse_list
from ..utils import is_email
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
SENDGRID_HTTP_ERROR_MAP = {
diff --git a/libs/apprise/plugins/serverchan.py b/libs/apprise/plugins/NotifyServerChan.py
index e3abaa354..cf250cf5b 100644
--- a/libs/apprise/plugins/serverchan.py
+++ b/libs/apprise/plugins/NotifyServerChan.py
@@ -30,9 +30,9 @@ import re
import requests
from ..common import NotifyType
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Register at https://sct.ftqq.com/
diff --git a/libs/apprise/plugins/signal_api.py b/libs/apprise/plugins/NotifySignalAPI.py
index 7e557133c..b35b4989e 100644
--- a/libs/apprise/plugins/signal_api.py
+++ b/libs/apprise/plugins/NotifySignalAPI.py
@@ -31,13 +31,13 @@ import requests
from json import dumps
import base64
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import parse_bool
-from ..url import PrivacyMode
-from ..locale import gettext_lazy as _
+from ..URLBase import PrivacyMode
+from ..AppriseLocale import gettext_lazy as _
GROUP_REGEX = re.compile(
diff --git a/libs/apprise/plugins/simplepush.py b/libs/apprise/plugins/NotifySimplePush.py
index 10b01b0f8..3851e1e3c 100644
--- a/libs/apprise/plugins/simplepush.py
+++ b/libs/apprise/plugins/NotifySimplePush.py
@@ -30,11 +30,11 @@ from os import urandom
from json import loads
import requests
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
from base64 import urlsafe_b64encode
import hashlib
diff --git a/libs/apprise/plugins/sinch.py b/libs/apprise/plugins/NotifySinch.py
index 06bd5b1e7..74b3c452a 100644
--- a/libs/apprise/plugins/sinch.py
+++ b/libs/apprise/plugins/NotifySinch.py
@@ -39,13 +39,13 @@
import requests
import json
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class SinchRegion:
diff --git a/libs/apprise/plugins/slack.py b/libs/apprise/plugins/NotifySlack.py
index b929dfb46..b66fe99f4 100644
--- a/libs/apprise/plugins/slack.py
+++ b/libs/apprise/plugins/NotifySlack.py
@@ -78,7 +78,7 @@ from json import dumps
from json import loads
from time import time
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..common import NotifyFormat
@@ -86,7 +86,7 @@ from ..utils import is_email
from ..utils import parse_bool
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
SLACK_HTTP_ERROR_MAP = {
diff --git a/libs/apprise/plugins/sparkpost.py b/libs/apprise/plugins/NotifySparkPost.py
index b873d6b0e..255db0709 100644
--- a/libs/apprise/plugins/sparkpost.py
+++ b/libs/apprise/plugins/NotifySparkPost.py
@@ -58,7 +58,7 @@ import requests
import base64
from json import loads
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyFormat
from ..utils import is_email
@@ -66,7 +66,7 @@ from email.utils import formataddr
from ..utils import validate_regex
from ..utils import parse_emails
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Provide some known codes SparkPost uses and what they translate to:
# Based on https://www.sparkpost.com/docs/tech-resources/extended-error-codes/
diff --git a/libs/apprise/plugins/streamlabs.py b/libs/apprise/plugins/NotifyStreamlabs.py
index c534f1ba6..d1e4186a6 100644
--- a/libs/apprise/plugins/streamlabs.py
+++ b/libs/apprise/plugins/NotifyStreamlabs.py
@@ -38,10 +38,10 @@
#
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# calls
diff --git a/libs/apprise/plugins/synology.py b/libs/apprise/plugins/NotifySynology.py
index ed85f80c0..be58c0643 100644
--- a/libs/apprise/plugins/synology.py
+++ b/libs/apprise/plugins/NotifySynology.py
@@ -29,10 +29,10 @@
import requests
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# For API Details see:
# https://kb.synology.com/en-au/DSM/help/Chat/chat_integration
diff --git a/libs/apprise/plugins/syslog.py b/libs/apprise/plugins/NotifySyslog.py
index 935111eea..5540fc758 100644
--- a/libs/apprise/plugins/syslog.py
+++ b/libs/apprise/plugins/NotifySyslog.py
@@ -28,10 +28,10 @@
import syslog
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class SyslogFacility:
diff --git a/libs/apprise/plugins/techuluspush.py b/libs/apprise/plugins/NotifyTechulusPush.py
index 682bf088e..4d0b99348 100644
--- a/libs/apprise/plugins/techuluspush.py
+++ b/libs/apprise/plugins/NotifyTechulusPush.py
@@ -53,10 +53,10 @@
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Token required as part of the API request
# Used to prepare our UUID regex matching
diff --git a/libs/apprise/plugins/telegram.py b/libs/apprise/plugins/NotifyTelegram.py
index 6b997f574..cce8af625 100644
--- a/libs/apprise/plugins/telegram.py
+++ b/libs/apprise/plugins/NotifyTelegram.py
@@ -59,15 +59,15 @@ import os
from json import loads
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyImageSize
from ..common import NotifyFormat
from ..utils import parse_bool
from ..utils import parse_list
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
-from ..attachment.base import AttachBase
+from ..AppriseLocale import gettext_lazy as _
+from ..attachment.AttachBase import AttachBase
TELEGRAM_IMAGE_XY = NotifyImageSize.XY_256
diff --git a/libs/apprise/plugins/threema.py b/libs/apprise/plugins/NotifyThreema.py
index 423c23124..c2ad82e2e 100644
--- a/libs/apprise/plugins/threema.py
+++ b/libs/apprise/plugins/NotifyThreema.py
@@ -35,14 +35,14 @@
import requests
from itertools import chain
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import validate_regex
from ..utils import is_email
-from ..url import PrivacyMode
+from ..URLBase import PrivacyMode
from ..utils import parse_list
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class ThreemaRecipientTypes:
diff --git a/libs/apprise/plugins/twilio.py b/libs/apprise/plugins/NotifyTwilio.py
index 4205e37f0..863b09a94 100644
--- a/libs/apprise/plugins/twilio.py
+++ b/libs/apprise/plugins/NotifyTwilio.py
@@ -46,13 +46,13 @@
import requests
from json import loads
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyTwilio(NotifyBase):
diff --git a/libs/apprise/plugins/twist.py b/libs/apprise/plugins/NotifyTwist.py
index 62d729f4f..fa26feb84 100644
--- a/libs/apprise/plugins/twist.py
+++ b/libs/apprise/plugins/NotifyTwist.py
@@ -35,13 +35,13 @@ import requests
from json import loads
from itertools import chain
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyFormat
from ..common import NotifyType
from ..utils import parse_list
from ..utils import is_email
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# A workspace can also be interpreted as a team name too!
diff --git a/libs/apprise/plugins/twitter.py b/libs/apprise/plugins/NotifyTwitter.py
index 8000a8151..7a0813c1f 100644
--- a/libs/apprise/plugins/twitter.py
+++ b/libs/apprise/plugins/NotifyTwitter.py
@@ -36,14 +36,14 @@ from datetime import timezone
from requests_oauthlib import OAuth1
from json import dumps
from json import loads
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import parse_list
from ..utils import parse_bool
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
-from ..attachment.base import AttachBase
+from ..AppriseLocale import gettext_lazy as _
+from ..attachment.AttachBase import AttachBase
IS_USER = re.compile(r'^\s*@?(?P<user>[A-Z0-9_]+)$', re.I)
diff --git a/libs/apprise/plugins/voipms.py b/libs/apprise/plugins/NotifyVoipms.py
index 3a4e6d25f..a023589a7 100644
--- a/libs/apprise/plugins/voipms.py
+++ b/libs/apprise/plugins/NotifyVoipms.py
@@ -37,12 +37,12 @@
import requests
from json import loads
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import is_email
from ..utils import parse_phone_no
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyVoipms(NotifyBase):
diff --git a/libs/apprise/plugins/vonage.py b/libs/apprise/plugins/NotifyVonage.py
index 441a6ba6b..e9b1422ad 100644
--- a/libs/apprise/plugins/vonage.py
+++ b/libs/apprise/plugins/NotifyVonage.py
@@ -33,13 +33,13 @@
#
import requests
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyVonage(NotifyBase):
diff --git a/libs/apprise/plugins/wecombot.py b/libs/apprise/plugins/NotifyWeComBot.py
index ab6341718..4289b39e9 100644
--- a/libs/apprise/plugins/wecombot.py
+++ b/libs/apprise/plugins/NotifyWeComBot.py
@@ -59,10 +59,10 @@ import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyWeComBot(NotifyBase):
diff --git a/libs/apprise/plugins/webexteams.py b/libs/apprise/plugins/NotifyWebexTeams.py
index bd0bdb577..c91864bad 100644
--- a/libs/apprise/plugins/webexteams.py
+++ b/libs/apprise/plugins/NotifyWebexTeams.py
@@ -63,11 +63,11 @@ import re
import requests
from json import dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..common import NotifyFormat
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Extend HTTP Error Messages
# Based on: https://developer.webex.com/docs/api/basics/rate-limiting
diff --git a/libs/apprise/plugins/whatsapp.py b/libs/apprise/plugins/NotifyWhatsApp.py
index 7120d736c..4ccbcbdaf 100644
--- a/libs/apprise/plugins/whatsapp.py
+++ b/libs/apprise/plugins/NotifyWhatsApp.py
@@ -44,12 +44,12 @@
import re
import requests
from json import loads, dumps
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import is_phone_no
from ..utils import parse_phone_no
from ..utils import validate_regex
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyWhatsApp(NotifyBase):
diff --git a/libs/apprise/plugins/windows.py b/libs/apprise/plugins/NotifyWindows.py
index 746fcd1dd..207e0f221 100644
--- a/libs/apprise/plugins/windows.py
+++ b/libs/apprise/plugins/NotifyWindows.py
@@ -28,11 +28,11 @@
from time import sleep
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NotifyType
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# Default our global support flag
NOTIFY_WINDOWS_SUPPORT_ENABLED = False
diff --git a/libs/apprise/plugins/xbmc.py b/libs/apprise/plugins/NotifyXBMC.py
index 8006e1005..7d4462e41 100644
--- a/libs/apprise/plugins/xbmc.py
+++ b/libs/apprise/plugins/NotifyXBMC.py
@@ -29,12 +29,12 @@
import requests
from json import dumps
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyType
from ..common import NotifyImageSize
from ..utils import parse_bool
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class NotifyXBMC(NotifyBase):
diff --git a/libs/apprise/plugins/custom_xml.py b/libs/apprise/plugins/NotifyXML.py
index b7928fceb..21ccb79d3 100644
--- a/libs/apprise/plugins/custom_xml.py
+++ b/libs/apprise/plugins/NotifyXML.py
@@ -30,11 +30,11 @@ import re
import requests
import base64
-from .base import NotifyBase
-from ..url import PrivacyMode
+from .NotifyBase import NotifyBase
+from ..URLBase import PrivacyMode
from ..common import NotifyImageSize
from ..common import NotifyType
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
class XMLPayloadField:
diff --git a/libs/apprise/plugins/zulip.py b/libs/apprise/plugins/NotifyZulip.py
index e829e6f6d..54fe2d062 100644
--- a/libs/apprise/plugins/zulip.py
+++ b/libs/apprise/plugins/NotifyZulip.py
@@ -61,13 +61,13 @@
import re
import requests
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyType
from ..utils import parse_list
from ..utils import validate_regex
from ..utils import is_email
from ..utils import remove_suffix
-from ..locale import gettext_lazy as _
+from ..AppriseLocale import gettext_lazy as _
# A Valid Bot Name
VALIDATE_BOTNAME = re.compile(r'(?P<name>[A-Z0-9_-]{1,32})', re.I)
diff --git a/libs/apprise/plugins/__init__.py b/libs/apprise/plugins/__init__.py
index bfce14371..72cb08fbf 100644
--- a/libs/apprise/plugins/__init__.py
+++ b/libs/apprise/plugins/__init__.py
@@ -30,7 +30,7 @@ import os
import copy
# Used for testing
-from .base import NotifyBase
+from .NotifyBase import NotifyBase
from ..common import NotifyImageSize
from ..common import NOTIFY_IMAGE_SIZES
@@ -40,9 +40,9 @@ from ..utils import parse_list
from ..utils import cwe312_url
from ..utils import GET_SCHEMA_RE
from ..logger import logger
-from ..locale import gettext_lazy as _
-from ..locale import LazyTranslation
-from ..manager_plugins import NotificationManager
+from ..AppriseLocale import gettext_lazy as _
+from ..AppriseLocale import LazyTranslation
+from ..NotificationManager import NotificationManager
# Grant access to our Notification Manager Singleton
diff --git a/libs/apprise/utils.py b/libs/apprise/utils.py
index b33ec0749..e1881f314 100644
--- a/libs/apprise/utils.py
+++ b/libs/apprise/utils.py
@@ -541,7 +541,7 @@ def tidy_path(path):
return path
-def parse_qsd(qs, simple=False, plus_to_space=False, sanitize=True):
+def parse_qsd(qs, simple=False, plus_to_space=False):
"""
Query String Dictionary Builder
@@ -568,8 +568,6 @@ def parse_qsd(qs, simple=False, plus_to_space=False, sanitize=True):
per normal URL Encoded defininition. Normal URL parsing applies
this, but `+` is very actively used character with passwords,
api keys, tokens, etc. So Apprise does not do this by default.
-
- if sanitize is set to False, then kwargs are not placed into lowercase
"""
# Our return result set:
@@ -610,7 +608,7 @@ def parse_qsd(qs, simple=False, plus_to_space=False, sanitize=True):
# Always Query String Dictionary (qsd) for every entry we have
# content is always made lowercase for easy indexing
- result['qsd'][key.lower().strip() if sanitize else key] = val
+ result['qsd'][key.lower().strip()] = val
if simple:
# move along
@@ -638,7 +636,7 @@ def parse_qsd(qs, simple=False, plus_to_space=False, sanitize=True):
def parse_url(url, default_schema='http', verify_host=True, strict_port=False,
- simple=False, plus_to_space=False, sanitize=True):
+ simple=False, plus_to_space=False):
"""A function that greatly simplifies the parsing of a url
specified by the end user.
@@ -693,8 +691,6 @@ def parse_url(url, default_schema='http', verify_host=True, strict_port=False,
If the URL can't be parsed then None is returned
- If sanitize is set to False, then kwargs are not placed in lowercase
- and wrapping whitespace is not removed
"""
if not isinstance(url, str):
@@ -754,8 +750,7 @@ def parse_url(url, default_schema='http', verify_host=True, strict_port=False,
# while ensuring that all keys are lowercase
if qsdata:
result.update(parse_qsd(
- qsdata, simple=simple, plus_to_space=plus_to_space,
- sanitize=sanitize))
+ qsdata, simple=simple, plus_to_space=plus_to_space))
# Now do a proper extraction of data; http:// is just substitued in place
# to allow urlparse() to function as expected, we'll swap this back to the
diff --git a/libs/version.txt b/libs/version.txt
index 8ac12d74d..ccabf65cc 100644
--- a/libs/version.txt
+++ b/libs/version.txt
@@ -2,7 +2,7 @@
alembic==1.13.1
aniso8601==9.0.1
argparse==1.4.0
-apprise==1.8.0
+apprise==1.7.6
apscheduler<=3.10.4
attrs==23.2.0
blinker==1.7.0