From 2c46004839115022dc97fe833219c2f059a03fda Mon Sep 17 00:00:00 2001 From: miigotu Date: Sat, 22 Oct 2022 19:01:18 -0400 Subject: [PATCH] feat(extensions): start building an interface to split notifiers, providers, metadata, clients, etc out into namespaced plugin packages Signed-off-by: miigotu --- sickchill/extensions/manager.py | 49 ++++++++++ sickchill/oldbeard/stevedore.py | 152 -------------------------------- sickchill/settings.py | 3 +- 3 files changed, 51 insertions(+), 153 deletions(-) create mode 100644 sickchill/extensions/manager.py delete mode 100644 sickchill/oldbeard/stevedore.py diff --git a/sickchill/extensions/manager.py b/sickchill/extensions/manager.py new file mode 100644 index 0000000000..984f2d1fd3 --- /dev/null +++ b/sickchill/extensions/manager.py @@ -0,0 +1,49 @@ +import importlib +import pkgutil + +from sickchill import logger, settings +from sickchill.oldbeard import config + +import sickchill.extensions + + +def iter_namespace(ns_pkg): + return pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + ".") + + +def discover(): + global extenstions + extensions = {} + for finder, name, ispkg in iter_namespace(sickchill.extensions): + if name == __name__: + continue + try: + plugin = importlib.import_module(name) + extensions[name] = plugin + except Exception as e: + logger.debug("Error importing extension: {0}".format(name), exc_info=e) + + config.check_section(settings.CFG, "extensions") + for extension in extensions: + logger.debug("Loading {extension} from {path}".format(extension=extension, path=extensions[extension].__path__)) + config.check_section(settings.CFG["extensions"], extension.name) + + global clients, providers, metadata, notifiers, indexers, post_processors + + # Clients + clients = {extension.name: extension for name, extension in extensions.items() if hasattr(extension, "Client")} + + # Providers + providers = {extension.name: extension for name, extension in extensions.items() if hasattr(extension, "Provider")} + + # Metadata + metadata = {extension.name: extension for name, extension in extensions.items() if hasattr(extension, "Metadata")} + + # Notifiers + notifiers = {extension.name: extension for name, extension in extensions.items() if hasattr(extension, "Notifier")} + + # TVDB, TVMAZE, TMDB, etc + indexers = {extension.name: extension for name, extension in extensions.items() if hasattr(extension, "Indexer")} + + # Post Processors + post_processors = {extension.name: extension for name, extension in extensions.items() if hasattr(extension, "PostProcessor")} diff --git a/sickchill/oldbeard/stevedore.py b/sickchill/oldbeard/stevedore.py deleted file mode 100644 index 98acb3e419..0000000000 --- a/sickchill/oldbeard/stevedore.py +++ /dev/null @@ -1,152 +0,0 @@ -from subliminal.extensions import RegistrableExtensionManager - -clients = RegistrableExtensionManager( - "oldbeard.clients", - [ - "deluge = oldbeard.clients.deluge:Client", - "deluged = oldbeard.clients.deluged:Client", - "download_station = oldbeard.clients.download_station:Client", - "mlnet = oldbeard.clients.mlnet:Client", - "qbittorrent = oldbeard.clients.qbittorrent:Client", - "putio = oldbeard.clients.putio:Client", - "rtorrent = oldbeard.clients.rtorrent:Client", - "transmission = oldbeard.clients.transmission:Client", - "utorrent = oldbeard.clients.utorrent:Client", - ], -) - -providers = RegistrableExtensionManager( - "oldbeard.providers", - [ - "hdspace = oldbeard.providers.hdspace:HDSpaceProvider", - "ncore = oldbeard.providers.ncore:NcoreProvider", - "tntvillage = oldbeard.providers.tntvillage:TNTVillageProvider", - "rarbg = oldbeard.providers.rarbg:RarbgProvider", - "elitetorrent = oldbeard.providers.elitetorrent:EliteTorrentProvider", - "hd4free = oldbeard.providers.hd4free:HD4FreeProvider", - "horriblesubs = oldbeard.providers.horriblesubs:HorribleSubsProvider", - "limetorrents = oldbeard.providers.limetorrents:LimeTorrentsProvider", - "cpasbien = oldbeard.providers.cpasbien:CpasbienProvider", - "bjshare = oldbeard.providers.bjshare:BJShareProvider", - "tvchaosuk = oldbeard.providers.tvchaosuk:TVChaosUKProvider", - "eztv = oldbeard.providers.eztv:EZTVProvider", - "shazbat = oldbeard.providers.shazbat:ShazbatProvider", - "scc = oldbeard.providers.scc:SCCProvider", - "thepiratebay = oldbeard.providers.thepiratebay:ThePirateBayProvider", - "torrent_paradise = oldbeard.providers.torrent_paradise:Provider", - "nyaa = oldbeard.providers.nyaa:NyaaProvider", - "bitcannon = oldbeard.providers.bitcannon:BitCannonProvider", - "magnetdl = oldbeard.providers.magnetdl:MagnetDLProvider", - "hdtorrents_it = oldbeard.providers.hdtorrents_it:HDTorrentsProvider_IT", - "skytorrents = oldbeard.providers.skytorrents:SkyTorrents", - "xthor = oldbeard.providers.xthor:XThorProvider", - "norbits = oldbeard.providers.norbits:NorbitsProvider", - "yggtorrent = oldbeard.providers.yggtorrent:YggTorrentProvider", - "torrentbytes = oldbeard.providers.torrentbytes:TorrentBytesProvider", - "btn = oldbeard.providers.btn:BTNProvider", - "demonoid = oldbeard.providers.demonoid:DemonoidProvider", - "tokyotoshokan = oldbeard.providers.tokyotoshokan:TokyoToshokanProvider", - "speedcd = oldbeard.providers.speedcd:SpeedCDProvider", - "kat = oldbeard.providers.kat:KatProvider", - "scenetime = oldbeard.providers.scenetime:SceneTimeProvider", - "alpharatio = oldbeard.providers.alpharatio:AlphaRatioProvider", - "hounddawgs = oldbeard.providers.hounddawgs:HoundDawgsProvider", - "hdbits = oldbeard.providers.hdbits:HDBitsProvider", - "pretome = oldbeard.providers.pretome:PretomeProvider", - "binsearch = oldbeard.providers.binsearch:BinSearchProvider", - "morethantv = oldbeard.providers.morethantv:MoreThanTVProvider", - "torrentz = oldbeard.providers.torrentz:TorrentzProvider", - "archetorrent = oldbeard.providers.archetorrent:ArcheTorrentProvider", - "hdtorrents = oldbeard.providers.hdtorrents:HDTorrentsProvider", - "immortalseed = oldbeard.providers.immortalseed:ImmortalseedProvider", - "ilcorsaronero = oldbeard.providers.ilcorsaronero:ilCorsaroNeroProvider", - "iptorrents = oldbeard.providers.iptorrents:IPTorrentsProvider", - "torrent9 = oldbeard.providers.torrent9:Torrent9Provider", - "newpct = oldbeard.providers.newpct:newpctProvider", - "filelist = oldbeard.providers.filelist:FileListProvider", - "abnormal = oldbeard.providers.abnormal:ABNormalProvider", - "torrentproject = oldbeard.providers.torrentproject:TorrentProjectProvider", - "danishbits = oldbeard.providers.danishbits:DanishbitsProvider", - "omgwtfnzbs = oldbeard.providers.omgwtfnzbs:OmgwtfnzbsProvider", - "gimmepeers = oldbeard.providers.gimmepeers:GimmePeersProvider", - "nebulance = oldbeard.providers.nebulance:NebulanceProvider", - "torrentday = oldbeard.providers.torrentday:TorrentDayProvider", - "torrentleech = oldbeard.providers.torrentleech:TorrentLeechProvider", - ], -) - -notifiers = RegistrableExtensionManager( - "oldbeard.notifiers", - [ - "plex = oldbeard.notifiers.plex:Notifier", - "synoindex = oldbeard.notifiers.synoindex:Notifier", - "telegram = oldbeard.notifiers.telegram:Notifier", - "trakt = oldbeard.notifiers.trakt:Notifier", - "join = oldbeard.notifiers.join:Notifier", - "growl = oldbeard.notifiers.growl:Notifier", - "emby = oldbeard.notifiers.emby:Notifier", - "pushbullet = oldbeard.notifiers.pushbullet:Notifier", - "nmjv2 = oldbeard.notifiers.nmjv2:Notifier", - "tweet = oldbeard.notifiers.tweet:Notifier", - "growl = oldbeard.notifiers.growl:Notifier", - "pushalot = oldbeard.notifiers.pushalot:Notifier", - "emailnotify = oldbeard.notifiers.emailnotify:Notifier", - "prowl = oldbeard.notifiers.prowl:Notifier", - "boxcar2 = oldbeard.notifiers.boxcar2:Notifier", - "pytivo = oldbeard.notifiers.pytivo:Notifier", - "boxcar2 = oldbeard.notifiers.boxcar2:Notifier", - "nmj = oldbeard.notifiers.nmj:Notifier", - "synologynotifier = oldbeard.notifiers.synologynotifier:Notifier", - "matrix = oldbeard.notifiers.matrix:Notifier", - "rocketchat = oldbeard.notifiers.rocketchat:Notifier", - "trakt = oldbeard.notifiers.trakt:Notifier", - "libnotify = oldbeard.notifiers.libnotify:Notifier", - "rocketchat = oldbeard.notifiers.rocketchat:Notifier", - "discord = oldbeard.notifiers.discord:Notifier", - "pushbullet = oldbeard.notifiers.pushbullet:Notifier", - # "twilio_notify = oldbeard.notifiers.twilio_notify:Notifier", - "tweet = oldbeard.notifiers.tweet:Notifier", - "synologynotifier = oldbeard.notifiers.synologynotifier:Notifier", - "plex = oldbeard.notifiers.plex:Notifier", - "discord = oldbeard.notifiers.discord:Notifier", - "freemobile = oldbeard.notifiers.freemobile:Notifier", - "slack = oldbeard.notifiers.slack:Notifier", - "matrix = oldbeard.notifiers.matrix:Notifier", - "synoindex = oldbeard.notifiers.synoindex:Notifier", - "kodi = oldbeard.notifiers.kodi:Notifier", - "nmjv2 = oldbeard.notifiers.nmjv2:Notifier", - "emailnotify = oldbeard.notifiers.emailnotify:Notifier", - "kodi = oldbeard.notifiers.kodi:Notifier", - "pushalot = oldbeard.notifiers.pushalot:Notifier", - "prowl = oldbeard.notifiers.prowl:Notifier", - "pushover = oldbeard.notifiers.pushover:Notifier", - "telegram = oldbeard.notifiers.telegram:Notifier", - "pytivo = oldbeard.notifiers.pytivo:Notifier", - "join = oldbeard.notifiers.join:Notifier", - "pushover = oldbeard.notifiers.pushover:Notifier", - "base = oldbeard.notifiers.base:Notifier", - "emby = oldbeard.notifiers.emby:Notifier", - "slack = oldbeard.notifiers.slack:Notifier", - "freemobile = oldbeard.notifiers.freemobile:Notifier", - "libnotify = oldbeard.notifiers.libnotify:Notifier", - "nmj = oldbeard.notifiers.nmj:Notifier", - ], -) - -metadata = RegistrableExtensionManager( - "sickchill.providers.metadata", - [ - "mede8er = sickchill.providers.metadata.mede8er:Mede8erMetadata", - "ps3 = sickchill.providers.metadata.ps3:PS3Metadata", - "tivo = sickchill.providers.metadata.tivo:TIVOMetadata", - "mede8er = sickchill.providers.metadata.mede8er:Mede8erMetadata", - "tivo = sickchill.providers.metadata.tivo:TIVOMetadata", - "mediabrowser = sickchill.providers.metadata.mediabrowser:MediaBrowserMetadata", - "wdtv = sickchill.providers.metadata.wdtv:WDTVMetadata", - "kodi = sickchill.providers.metadata.kodi:KODIMetadata", - "wdtv = sickchill.providers.metadata.wdtv:WDTVMetadata", - "kodi = sickchill.providers.metadata.kodi:KODIMetadata", - "mediabrowser = sickchill.providers.metadata.mediabrowser:MediaBrowserMetadata", - "ps3 = sickchill.providers.metadata.ps3:PS3Metadata", - ], -) diff --git a/sickchill/settings.py b/sickchill/settings.py index 922f829f07..017dbd559e 100644 --- a/sickchill/settings.py +++ b/sickchill/settings.py @@ -11,6 +11,7 @@ if TYPE_CHECKING: from .movies import MovieList + from configobj import ConfigObj setup_gettext() @@ -82,7 +83,7 @@ CALENDAR_UNPROTECTED = False CF_AUTH_DOMAIN = "" CF_POLICY_AUD = "" -CFG = None +CFG: "ConfigObj" = None CHECK_PROPERS_INTERVAL = None CLIENT_WEB_URLS = {"torrent": "", "newznab": ""} COMING_EPS_DISPLAY_PAUSED = False