1from loguru import logger
2
3from flexget import entry, plugin
4from flexget.components.emby.api_emby import EmbyApi, EmbyAuth
5from flexget.components.emby.emby_util import SCHEMA_SERVER, get_field_map
6from flexget.event import event
7
8logger = logger.bind(name='emby_lookup')
9
10
11class EmbyLookup:
12    """
13    Preforms Emby Lookup
14
15    Example:
16        emby_lookup:
17            host: http://localhost:8096
18            username: <username>
19            apikey: <apikey>
20            return_host: wan
21    """
22
23    auth = {}
24
25    schema = {**SCHEMA_SERVER}
26
27    def on_task_start(self, task, config):
28        if not isinstance(config, dict):
29            config = {}
30
31        self.auth = EmbyAuth(**config)
32
33        try:
34            self.auth.login(False)
35        except plugin.PluginError as e:
36            logger.error('Not possible to login to emby: {}', e)
37
38    @entry.register_lazy_lookup('emby_lookup')
39    def lazy_loader(self, entry, auth):
40        if not auth:
41            return
42
43        if not auth.logged:
44            auth.login()
45
46        emby_api = EmbyApi(auth)
47        emby_data = emby_api.search(**entry)
48
49        if not emby_data:
50            return
51
52        emby_type = EmbyApi.get_type(**emby_data)
53
54        lazy_fields = get_field_map(media_type=emby_type)
55        if not lazy_fields:
56            return
57
58        entry.update_using_map(lazy_fields, emby_data, ignore_none=True)
59
60    def add_lazy(self, entry, media_type):
61        lazy_fields = get_field_map(media_type=media_type)
62
63        entry.add_lazy_fields(self.lazy_loader, lazy_fields, kwargs={'auth': self.auth})
64
65        entry['emby_server_id'] = self.auth.server_id
66        entry['emby_username'] = self.auth.username
67        entry['emby_user_id'] = self.auth.uid
68
69    # Run after series and metainfo series and imdb
70    @plugin.priority(110)
71    def on_task_metainfo(self, task, config):
72        if not config:
73            return
74
75        for entry in task.entries:
76            self.add_lazy(entry, EmbyApi.get_type(**entry))
77
78    @property
79    def movie_identifier(self):
80        """Returns the plugin main identifier type"""
81        return 'emby_movie_id'
82
83    @property
84    def series_identifier(self):
85        """Returns the plugin main identifier type"""
86        return 'emby_serie_id'
87
88
89@event('plugin.register')
90def register_plugin():
91    plugin.register(
92        EmbyLookup,
93        'emby_lookup',
94        api_ver=2,
95        interfaces=['task', 'series_metainfo', 'movie_metainfo'],
96    )
97