Test Failed
Push — beta ( 918fe2...7d3e07 )
by Dean
03:03
created

Base.build_episode()   B

Complexity

Conditions 5

Size

Total Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 2
Bugs 0 Features 0
Metric Value
dl 0
loc 37
ccs 0
cts 9
cp 0
rs 8.0894
c 2
b 0
f 0
cc 5
crap 30
1
from plugin.core.filters import Filters
0 ignored issues
show
Bug introduced by
The name filters does not seem to exist in module plugin.core.
Loading history...
Configuration introduced by
Unable to import 'plugin.core.filters' (invalid syntax (<string>, line 196))

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
2
from plugin.core.helpers.variable import merge
3
from plugin.core.identifier import Identifier
4
from plugin.managers.session.base import UpdateSession
0 ignored issues
show
Bug introduced by
The name base does not seem to exist in module plugin.managers.session.
Loading history...
Configuration introduced by
Unable to import 'plugin.managers.session.base' (invalid syntax (<string>, line 67))

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
5
from plugin.modules.core.manager import ModuleManager
0 ignored issues
show
Bug introduced by
The name manager does not seem to exist in module plugin.modules.core.
Loading history...
Configuration introduced by
Unable to import 'plugin.modules.core.manager' (invalid syntax (<string>, line 40))

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
6
7
from plex.objects.library.metadata.episode import Episode
8
from plex.objects.library.metadata.movie import Movie
9
from plex_metadata import Metadata, Guid
10
import logging
11
12
log = logging.getLogger(__name__)
13
14
15
class Base(object):
16
    name = None
17
18
    @classmethod
19
    def build_request(cls, session, part=None, rating_key=None, view_offset=None):
20
        # Retrieve metadata for session
21
        if part is None:
22
            part = session.part
23
24
        if rating_key is None:
25
            rating_key = session.rating_key
26
27
        # Retrieve metadata
28
        metadata = Metadata.get(rating_key)
29
30
        # Queue a flush for the metadata cache
31
        Metadata.cache.flush_queue()
32
33
        # Validate metadata
34
        if not metadata:
35
            log.warn('Unable to retrieve metadata for rating_key %r', rating_key)
36
            return None
37
38
        if metadata.type not in ['movie', 'episode']:
39
            log.info('Ignoring session with type %r for rating_key %r', metadata.type, rating_key)
40
            return None
41
42
        # Apply library/section filter
43
        if not Filters.is_valid_metadata_section(metadata):
44
            return None
45
46
        # Parse guid
47
        guid = Guid.parse(metadata.guid)
48
49
        # Build request from guid/metadata
50
        if type(metadata) is Movie:
51
            result = cls.build_movie(metadata, guid, part)
52
        elif type(metadata) is Episode:
53
            result = cls.build_episode(metadata, guid, part)
54
        else:
55
            return None
56
57
        if not result:
58
            return None
59
60
        # Retrieve media progress
61
        if view_offset is not None:
62
            # Calculate progress from `view_offset` parameter
63
            progress = UpdateSession.get_progress(
64
                metadata.duration, view_offset,
65
                part, session.part_count, session.part_duration
66
            )
67
        else:
68
            # Use session progress
69
            progress = session.progress
70
71
        # Merge progress into request
72
        return merge(result, {
73
            'progress': progress
74
        })
75
76
    @classmethod
77
    def build_episode(cls, episode, guid, part):
78
        ids = Identifier.get_ids(guid, strict=False)
79
80
        if not ids:
81
            # Try map episode to a supported service (with OEM)
82
            _, request = ModuleManager['mapper'].request_episode(
83
                guid, episode,
84
                part=part
85
            )
86
            return request
87
88
        # Retrieve episode number
89
        season_num, episodes = ModuleManager['matcher'].process(episode)
90
91
        if len(episodes) > 1 and part - 1 < len(episodes):
92
            episode_num = episodes[part - 1]
93
        elif len(episodes) > 1:
94
            log.warn('Part %s doesn\'t exist in episodes: %r', part, episodes)
95
            episode_num = episodes[0]
96
        else:
97
            log.warn('Matcher didn\'t return a valid result - season_num: %r, episodes: %r', season_num, episodes)
98
            episode_num = episode.index
99
100
        # Build request
101
        return {
102
            'show': {
103
                'title': episode.show.title,
104
                'year': episode.year,
105
106
                'ids': ids
107
            },
108
            'episode': {
109
                'title': episode.title,
110
111
                'season': season_num,
112
                'number': episode_num
113
            }
114
        }
115
116
    @staticmethod
117
    def build_movie(movie, guid, part):
118
        ids = Identifier.get_ids(guid, strict=False)
119
120
        if not ids:
121
            # Try map episode to a supported service (with OEM)
122
            _, request = ModuleManager['mapper'].request_movie(
123
                guid, movie,
124
                part=part
125
            )
126
            return request
127
128
        return {
129
            'movie': {
130
                'title': movie.title,
131
                'year': movie.year,
132
133
                'ids': ids
134
            }
135
        }
136
137
    @staticmethod
138
    def session_jumped(session, view_offset):
139
        if session.view_offset is None or view_offset is None:
140
            return False
141
142
        view_delta = view_offset - session.view_offset
143
144
        jump_offset = session.duration - session.view_offset - view_delta
145
        jump_perc = float(view_delta) / session.duration
146
147
        if jump_perc >= 0.98 and jump_offset < 1000:
148
            log.info('Session jumped: %r -> %r (delta: %r, jump_offset: %r, jump_perc: %r)', session.view_offset, view_offset, view_delta, jump_offset, jump_perc)
0 ignored issues
show
Coding Style introduced by
This line is too long as per the coding-style (162/120).

This check looks for lines that are too long. You can specify the maximum line length.

Loading history...
149
            return True
150
151
        return False
152