# Buggy code
def _notify_kodi(
    self,
    title,
    message,
    host=None,
    username=None,
    password=None,
    force=False,
    dest_app="KODI",
):
    """Private wrapper for the notify_snatch and notify_download functions.

    Detects JSON-RPC version then branches the logic for either the JSON-RPC or legacy HTTP API methods.

    Args:
        message: Message body of the notice to send
        title: Title of the notice to send
        host: KODI webserver host:port
        username: KODI webserver username
        password: KODI webserver password
        force: Used for the Test method to override config saftey checks

    Returns:
        Returns a list results in the format of host:ip:result
        The result will either be 'OK' or False, this is used to be parsed by the calling function.

    """
    # fill in omitted parameters
    if not host:
        host = app.KODI_HOST
    if not username:
        username = app.KODI_USERNAME
    if not password:
        password = app.KODI_PASSWORD

    # Sanitize host when not passed as a list
    if isinstance(host, (string_types, text_type)):
        host = host.split(",")

    # suppress notifications if the notifier is disabled but the notify options are checked
    if not app.USE_KODI and not force:
        log.debug(
            "Notification for {app} not enabled, skipping this notification",
            {"app": dest_app},
        )
        return False

    result = ""
    for cur_host in [x.strip() for x in host if x.strip()]:
        log.debug(
            "Sending {app} notification to {host} - {msg}",
            {"app": dest_app, "host": cur_host, "msg": message},
        )

        kodi_api = self._get_kodi_version(cur_host, username, password, dest_app)
        if kodi_api:
            if kodi_api <= 4:
                log.warning(
                    "Detected {app} version <= 11, this version is not supported by Medusa. "
                    "Please upgrade to the Kodi 12 or above.",
                    {"app": dest_app},
                )
            else:
                log.debug(
                    "Detected {app} version >= 12, using {app} JSON API",
                    {"app": dest_app},
                )
                command = {
                    "jsonrpc": "2.0",
                    "method": "GUI.ShowNotification",
                    "params": {
                        "title": title.encode("utf-8"),
                        "message": message.encode("utf-8"),
                        "image": app.LOGO_URL,
                    },
                    "id": "1",
                }
                notify_result = self._send_to_kodi(
                    command, cur_host, username, password, dest_app
                )
                if notify_result and notify_result.get("result"):
                    result += cur_host + ":" + notify_result["result"].decode("utf-8")
        else:
            if app.KODI_ALWAYS_ON or force:
                log.warning(
                    "Failed to detect {app} version for {host},"
                    " check configuration and try again.",
                    {"app": dest_app, "host": cur_host},
                )
            result += cur_host + ":False"

    return result


# Traceback (AttributeError)
2019-03-15 05:03:02 ERROR    TORNADO :: [94fae84] API :: AttributeError("'str' object has no attribute 'decode'")
Traceback (most recent call last):
File "/Users/matt/Builds/medusa/medusa/server/api/v1/core.py", line 142, in get
out_dict = _call_dispatcher(args, kwargs)
File "/Users/matt/Builds/medusa/medusa/server/api/v1/core.py", line 212, in call_dispatcher
cur_out_dict = func(cur_args, cur_kwargs).run()  # call function and get response
File "/Users/matt/Builds/medusa/medusa/server/api/v1/core.py", line 1308, in run
failed=self.failed, proc_type=self.type
File "/Users/matt/Builds/medusa/medusa/process_tv.py", line 145, in process
ignore_subs=ignore_subs)
File "/Users/matt/Builds/medusa/medusa/process_tv.py", line 335, in process_files
self.process_media(path, self.video_files, force, is_priority, ignore_subs)
File "/Users/matt/Builds/medusa/medusa/process_tv.py", line 556, in process_media
self.result = processor.process()
File "/Users/matt/Builds/medusa/medusa/post_processor.py", line 1289, in process
notifiers.notify_download(ep_obj)
File "/Users/matt/Builds/medusa/medusa/notifiers/__init__.py", line 100, in notify_download
n.notify_download(ep_obj)
File "/Users/matt/Builds/medusa/medusa/notifiers/kodi.py", line 434, in notify_download
self._notify_kodi(common.notifyStrings[common.NOTIFY_DOWNLOAD], ep_obj.pretty_name_with_quality())
File "/Users/matt/Builds/medusa/medusa/notifiers/kodi.py", line 133, in _notify_kodi
result += cur_host + ':' + notify_result['result'].decode('utf-8')
AttributeError: 'str' object has no attribute 'decode'
2019-03-15 05:03:02 INFO     TORNADO :: [94fae84] Selected poster for series 275557 (score=3.3221824253021945, score_bay=5.644364850604389, rating=6.8, votes=20, res=680x1000): https://www.thetvdb.com/banners/posters/275557-6.jpg
2019-03-15 05:03:02 INFO     TORNADO :: [94fae84] Selected fanart for series 275557 (score=3.9240400637751476, score_bay=5.848080127550295, rating=6.9, votes=9, res=1920x1080): https://www.thetvdb.com/banners/fanart/original/275557-8.jpg
2019-03-15 05:03:00 INFO     TORNADO :: [94fae84] 275557: Changed modify date of Broad.City.S05E08.Sleep.No.More.720p.WEB-DL.mkv to series air date Mar 14,2019 (22:00)
2019-03-15 05:02:46 INFO     TORNADO :: [94fae84] Release name (broad.city.s05e08.720p.web.x264-tbs) found from file (broad.city.s05e08.720p.web.x264-tbs.nfo)
2019-03-15 05:02:46 INFO     TORNADO :: [94fae84] This download is marked a priority download so I'm going to replace an existing file if I find one
2019-03-15 05:02:46 INFO     TORNADO :: [94fae84] New size: 432.58 MB
2019-03-15 05:02:46 INFO     TORNADO :: [94fae84] New file: /Volumes/dvorak.8tb/SABnzbd/tv/Broad.City.S05E08.720p.WEB.x264-TBS[TGx]/broad.city.s05e08.720p.web.x264-tbs.mkv
2019-03-15 05:02:46 INFO     TORNADO :: [94fae84] Processing /Volumes/dvorak.8tb/SABnzbd/tv/Broad.City.S05E08.720p.WEB.x264-TBS[TGx]/broad.city.s05e08.720p.web.x264-tbs.mkv

# Fixed code
def _notify_kodi(
    self,
    title,
    message,
    host=None,
    username=None,
    password=None,
    force=False,
    dest_app="KODI",
):
    """Private wrapper for the notify_snatch and notify_download functions.

    Detects JSON-RPC version then branches the logic for either the JSON-RPC or legacy HTTP API methods.

    Args:
        message: Message body of the notice to send
        title: Title of the notice to send
        host: KODI webserver host:port
        username: KODI webserver username
        password: KODI webserver password
        force: Used for the Test method to override config saftey checks

    Returns:
        Returns a list results in the format of host:ip:result
        The result will either be 'OK' or False, this is used to be parsed by the calling function.

    """
    # fill in omitted parameters
    if not host:
        host = app.KODI_HOST
    if not username:
        username = app.KODI_USERNAME
    if not password:
        password = app.KODI_PASSWORD

    # Sanitize host when not passed as a list
    if isinstance(host, (string_types, text_type)):
        host = host.split(",")

    # suppress notifications if the notifier is disabled but the notify options are checked
    if not app.USE_KODI and not force:
        log.debug(
            "Notification for {app} not enabled, skipping this notification",
            {"app": dest_app},
        )
        return False

    result = ""
    for cur_host in [x.strip() for x in host if x.strip()]:
        log.debug(
            "Sending {app} notification to {host} - {msg}",
            {"app": dest_app, "host": cur_host, "msg": message},
        )

        kodi_api = self._get_kodi_version(cur_host, username, password, dest_app)
        if kodi_api:
            if kodi_api <= 4:
                log.warning(
                    "Detected {app} version <= 11, this version is not supported by Medusa. "
                    "Please upgrade to the Kodi 12 or above.",
                    {"app": dest_app},
                )
            else:
                log.debug(
                    "Detected {app} version >= 12, using {app} JSON API",
                    {"app": dest_app},
                )
                command = {
                    "jsonrpc": "2.0",
                    "method": "GUI.ShowNotification",
                    "params": {
                        "title": title.encode("utf-8"),
                        "message": message.encode("utf-8"),
                        "image": app.LOGO_URL,
                    },
                    "id": "1",
                }
                notify_result = self._send_to_kodi(
                    command, cur_host, username, password, dest_app
                )
                if notify_result and notify_result.get("result"):
                    result += cur_host + ":" + notify_result["result"]
        else:
            if app.KODI_ALWAYS_ON or force:
                log.warning(
                    "Failed to detect {app} version for {host},"
                    " check configuration and try again.",
                    {"app": dest_app, "host": cur_host},
                )
            result += cur_host + ":False"

    return result