# Buggy code
def _get_anidb_exceptions(force):
    anidb_exceptions = defaultdict(dict)
    # AniDB exceptions use TVDB as indexer
    exceptions = anidb_exceptions[INDEXER_TVDBV2]

    if force or should_refresh("anidb"):
        logger.info("Checking for scene exceptions updates from AniDB")

        for show in app.showList:
            if all([show.name, show.is_anime, show.indexer == INDEXER_TVDBV2]):
                try:
                    anime = adba.Anime(
                        None,
                        name=show.name,
                        tvdbid=show.indexerid,
                        autoCorrectName=True,
                        cache_path=join(app.CACHE_DIR, "adba"),
                    )
                except ValueError as error:
                    logger.debug(
                        "Couldn't update scene exceptions for {show},"
                        " AniDB doesn't have this show. Error: {msg}",
                        {"show": show.name, "msg": error},
                    )
                    continue
                except Exception as error:
                    logger.error(
                        "Checking AniDB scene exceptions update failed"
                        " for {show}. Error: {msg}",
                        {"show": show.name, "msg": error},
                    )
                    continue

                if anime and anime.name != show.name:
                    series_id = int(show.series_id)
                    exceptions[series_id] = [{anime.name.decode("utf-8"): -1}]

        set_last_refresh("anidb")

    return anidb_exceptions


# 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 _get_anidb_exceptions(force):
    anidb_exceptions = defaultdict(dict)
    # AniDB exceptions use TVDB as indexer
    exceptions = anidb_exceptions[INDEXER_TVDBV2]

    if force or should_refresh("anidb"):
        logger.info("Checking for scene exceptions updates from AniDB")

        for show in app.showList:
            if all([show.name, show.is_anime, show.indexer == INDEXER_TVDBV2]):
                try:
                    anime = adba.Anime(
                        None,
                        name=show.name,
                        tvdbid=show.indexerid,
                        autoCorrectName=True,
                        cache_path=join(app.CACHE_DIR, "adba"),
                    )
                except ValueError as error:
                    logger.debug(
                        "Couldn't update scene exceptions for {show},"
                        " AniDB doesn't have this show. Error: {msg}",
                        {"show": show.name, "msg": error},
                    )
                    continue
                except Exception as error:
                    logger.error(
                        "Checking AniDB scene exceptions update failed"
                        " for {show}. Error: {msg}",
                        {"show": show.name, "msg": error},
                    )
                    continue

                if anime and anime.name != show.name:
                    series_id = int(show.series_id)
                    exceptions[series_id] = [{anime.name: -1}]

        set_last_refresh("anidb")

    return anidb_exceptions