UpdateWSession   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 112
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 10
c 0
b 0
f 0
dl 0
loc 112
ccs 0
cts 43
cp 0
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __call__() 0 9 1
F to_dict() 0 101 9
1
from plugin.core.helpers.variable import to_integer, merge, resolve
2
from plugin.managers.core.base import Manager
3
from plugin.managers.client import ClientManager
4
from plugin.managers.core.exceptions import FilteredException
5
from plugin.managers.session.base import GetSession, UpdateSession
6
from plugin.managers.user import UserManager
7
from plugin.models import Session
8
from plugin.modules.core.manager import ModuleManager
9
10
from datetime import datetime
11
from exception_wrappers.libraries import apsw
12
from plex import Plex
13
import logging
14
import peewee
15
16
17
log = logging.getLogger(__name__)
18
19
20
class GetWSession(GetSession):
21
    def __call__(self, info):
0 ignored issues
show
Bug introduced by
Arguments number differs from overridden '__call__' method
Loading history...
22
        session_key = to_integer(info.get('sessionKey'))
23
24
        return super(GetWSession, self).__call__(
25
            Session.session_key == self.build_session_key(session_key)
26
        )
27
28 View Code Duplication
    def or_create(self, info, fetch=False):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
Bug introduced by
Arguments number differs from overridden 'or_create' method
Loading history...
29
        session_key = to_integer(info.get('sessionKey'))
30
31
        try:
32
            # Create new session
33
            obj = self.manager.create(
34
                rating_key=to_integer(info.get('ratingKey')),
35
                session_key=self.build_session_key(session_key),
36
37
                state='create'
38
            )
39
40
            # Update newly created object
41
            self.manager.update(obj, info, fetch)
42
43
            # Update active sessions
44
            ModuleManager['sessions'].on_created(obj)
45
46
            return obj
47
        except (apsw.ConstraintError, peewee.IntegrityError):
48
            # Return existing object
49
            return self(info)
50
51
52
class UpdateWSession(UpdateSession):
53
    def __call__(self, obj, info, fetch=False):
54
        data = self.to_dict(obj, info, fetch)
55
56
        success = super(UpdateWSession, self).__call__(
57
            obj, data
58
        )
59
60
        ModuleManager['sessions'].on_updated(obj)
61
        return success
62
63
    def to_dict(self, obj, info, fetch=False):
64
        fetch = resolve(fetch, obj, info)
65
66
        view_offset = to_integer(info.get('viewOffset'))
67
68
        result = {
69
            'rating_key': to_integer(info.get('ratingKey')),
70
            'view_offset': view_offset,
71
72
            'updated_at': datetime.utcnow()
73
        }
74
75
        if not fetch:
76
            # Return simple update
77
            return merge(result, {
78
                'progress': self.get_progress(
79
                    obj.duration, view_offset,
80
                    obj.part, obj.part_count, obj.part_duration
81
                )
82
            })
83
84
        # Retrieve session key
85
        session_key = to_integer(info.get('sessionKey'))
86
87
        if not session_key:
88
            log.info('Missing session key, unable to fetch session details')
89
            return result
90
91
        # Retrieve active sessions
92
        log.debug('Fetching details for session #%s', session_key)
93
94
        p_sessions = Plex['status'].sessions()
95
96
        if not p_sessions:
97
            log.info('Unable to retrieve active sessions')
98
            return result
99
100
        # Find session matching `session_key`
101
        p_item = p_sessions.get(session_key)
102
103
        if not p_item:
104
            log.info('Unable to find session with key %r', session_key)
105
            return result
106
107
        # Retrieve metadata and guid
108
        p_metadata, guid = self.get_metadata(p_item.rating_key)
109
110
        if not p_metadata:
111
            log.info('Unable to retrieve metadata for rating_key %r', p_item.rating_key)
112
            return result
113
114
        if not guid or not guid.valid:
115
            return merge(result, {
116
                'duration': p_metadata.duration,
117
                'progress': self.get_progress(p_metadata.duration, view_offset)
118
            })
119
120
        # Retrieve media parts
121
        part, part_count, part_duration = self.match_parts(p_metadata, guid, view_offset)
122
123
        log.debug('Part: %s (part_count: %s, part_duration: %s)', part, part_count, part_duration)
124
125
        # Find matching client + user for session
126
        try:
127
            # Create/Retrieve `Client` for session
128
            result['client'] = ClientManager.get.or_create(
129
                p_item.session.player,
130
131
                fetch=True,
132
                match=True,
133
                filtered_exception=True
134
            )
135
136
            # Create/Retrieve `User` for session
137
            result['user'] = UserManager.get.or_create(
138
                p_item.session.user,
139
140
                fetch=True,
141
                match=True,
142
                filtered_exception=True
143
            )
144
145
            # Pick account from `client` or `user` objects
146
            result['account'] = self.get_account(result)
147
        except FilteredException:
148
            log.debug('Activity has been filtered')
149
150
            result['client'] = None
151
            result['user'] = None
152
153
            result['account'] = None
154
155
        return merge(result, {
156
            'part': part,
157
            'part_count': part_count,
158
            'part_duration': part_duration,
159
160
            'duration': p_metadata.duration,
161
            'progress': self.get_progress(
162
                p_metadata.duration, view_offset,
163
                part, part_count, part_duration
164
            )
165
        })
166
167
168
class WSessionManager(Manager):
169
    get = GetWSession
170
    update = UpdateWSession
171
172
    model = Session
173