From 5dd59d0307cde4982c5c880851ab69133607e8c8 Mon Sep 17 00:00:00 2001 From: Pedro de Oliveira Date: Sun, 14 Jul 2019 02:52:40 +0100 Subject: [PATCH] Add OMDb client --- OMDb/README.md | 5 ++ OMDb/__init__.py | 72 ++++++++++++++++++++ OMDb/config.py | 57 ++++++++++++++++ OMDb/local/__init__.py | 1 + OMDb/plugin.py | 145 +++++++++++++++++++++++++++++++++++++++++ OMDb/test.py | 38 +++++++++++ 6 files changed, 318 insertions(+) create mode 100644 OMDb/README.md create mode 100644 OMDb/__init__.py create mode 100644 OMDb/config.py create mode 100644 OMDb/local/__init__.py create mode 100644 OMDb/plugin.py create mode 100644 OMDb/test.py diff --git a/OMDb/README.md b/OMDb/README.md new file mode 100644 index 0000000..31afe53 --- /dev/null +++ b/OMDb/README.md @@ -0,0 +1,5 @@ +OMDb Client + +Dont forget to: + +config supybot.plugins.OMDb.apiKey your_api_key diff --git a/OMDb/__init__.py b/OMDb/__init__.py new file mode 100644 index 0000000..da26752 --- /dev/null +++ b/OMDb/__init__.py @@ -0,0 +1,72 @@ +### +# Copyright (c) 2019, Pedro de Oliveira +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * 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. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# 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 OWNER 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. + +### + +""" +OMDb: OMDb Client +""" + +import sys +import supybot +from supybot import world + +# Use this for the version of this plugin. You may wish to put a CVS keyword +# in here if you're keeping the plugin in CVS or some similar system. +__version__ = "" + +__author__ = supybot.Author('Pedro de Oliveira', 'falso', + 'falsovsky@gmail.com') + +# This is a dictionary mapping supybot.Author instances to lists of +# contributions. +__contributors__ = {} + +# This is a url where the most recent plugin package can be downloaded. +__url__ = '' + +from . import config +from . import plugin +if sys.version_info >= (3, 4): + from importlib import reload +else: + from imp import reload +# In case we're being reloaded. +reload(config) +reload(plugin) +# Add more reloads here if you add third-party modules and want them to be +# reloaded when this plugin is reloaded. Don't forget to import them as well! + +if world.testing: + from . import test + +Class = plugin.Class +configure = config.configure + + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/OMDb/config.py b/OMDb/config.py new file mode 100644 index 0000000..504a1b2 --- /dev/null +++ b/OMDb/config.py @@ -0,0 +1,57 @@ +### +# Copyright (c) 2019, Pedro de Oliveira +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * 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. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# 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 OWNER 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. + +### + +from supybot import conf, registry +try: + from supybot.i18n import PluginInternationalization + _ = PluginInternationalization('OMDb') +except: + # Placeholder that allows to run the plugin on a bot + # without the i18n module + _ = lambda x: x + + +def configure(advanced): + # This will be called by supybot to configure this module. advanced is + # a bool that specifies whether the user identified themself as an advanced + # user or not. You should effect your configuration by manipulating the + # registry as appropriate. + from supybot.questions import expect, anything, something, yn + conf.registerPlugin('OMDb', True) + + +OMDb = conf.registerPlugin('OMDb') +# This is where your configuration variables (if any) should go. For example: +# conf.registerGlobalValue(OMDb, 'someConfigVariableName', +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) +conf.registerGlobalValue(OMDb, 'apiKey', + registry.String("", _("""OMDb API key"""))) + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/OMDb/local/__init__.py b/OMDb/local/__init__.py new file mode 100644 index 0000000..e86e97b --- /dev/null +++ b/OMDb/local/__init__.py @@ -0,0 +1 @@ +# Stub so local is a module, used for third-party modules diff --git a/OMDb/plugin.py b/OMDb/plugin.py new file mode 100644 index 0000000..2c8300e --- /dev/null +++ b/OMDb/plugin.py @@ -0,0 +1,145 @@ +### +# Copyright (c) 2019, Pedro de Oliveira +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * 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. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# 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 OWNER 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. + +### + +from supybot import utils, plugins, ircutils, callbacks +from supybot.commands import * +try: + from supybot.i18n import PluginInternationalization + _ = PluginInternationalization('OMDb') +except ImportError: + # Placeholder that allows to run the plugin on a bot + # without the i18n module + _ = lambda x: x +from urllib.parse import urlencode +import json +import requests + + +class OMDb(callbacks.Plugin): + """OMDb Client""" + threaded = True + + def __init__(self, irc): + self.__parent = super(OMDb, self) + self.__parent.__init__(irc) + self.prepend = "8,4OMDb" + + + def __do_request(self, arguments): + baseurl = "http://www.omdbapi.com/" + arguments['apiKey'] = self.registryValue('apiKey') + response = requests.get(baseurl + "?" + urlencode(arguments)) + return json.loads(response.content.decode('utf-8')) + + def __format_result(self, result): + message = "{}".format(result['Title']) + + if 'Year' in result: + message = "{} ({})".format( + message, + result['Year'], + ) + + if 'Genre' in result: + message = "{} 8{}".format( + message, + result['Genre'], + ) + + if 'Runtime' in result: + message = "{} [{}]".format( + message, + result['Runtime'], + ) + + if 'imdbRating' in result: + message = "{} 13{}/10".format( + message, + result['imdbRating'], + ) + + if 'Plot' in result: + message = "{} {}".format( + message, + result['Plot'], + ) + + if 'imdbID' in result: + message = "{} https://www.imdb.com/title/{}/".format( + message, + result['imdbID'], + ) + + return message + + def find(self, irc, msg, args, text): + """ + + Returns the matched item with . + """ + key = self.registryValue('apiKey') + if not key: + irc.error("{} API key not set".format(self.prepend)) + return + result = self.__do_request({'s': text}) + + output = "" + for item in result['Search']: + output = "{}{} ({}) {}, ".format( + output, + item['Title'], + item['Year'], + item['imdbID'] + ) + + irc.reply(output[:-2], prefixNick=False) + find = wrap(find, ['something']) + + def info(self, irc, msg, args, text): + """ + + Returns information about of the item matched with . + """ + key = self.registryValue('apiKey') + if not key: + irc.error("{} API key not set".format(self.prepend)) + return + if text[:2] == 'tt': + result = self.__do_request({'i': text}) + else: + result = self.__do_request({'t': text}) + + irc.reply(self.__format_result(result), prefixNick=False) + info = wrap(info, ['something']) + +Class = OMDb + + +# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/OMDb/test.py b/OMDb/test.py new file mode 100644 index 0000000..32de848 --- /dev/null +++ b/OMDb/test.py @@ -0,0 +1,38 @@ +### +# Copyright (c) 2019, Pedro de Oliveira +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * 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. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# 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 OWNER 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. + +### + +from supybot.test import * + + +class OMDbTestCase(PluginTestCase): + plugins = ('OMDb',) + + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: