CastagnaIT/plugin.video.netflix

View on GitHub
resources/lib/config_wizard.py

Summary

Maintainability
A
0 mins
Test Coverage
# -*- coding: utf-8 -*-
"""
    Copyright (C) 2017 Sebastian Golasch (plugin.video.netflix)
    Copyright (C) 2020 Stefano Gottardo - @CastagnaIT (original implementation module)
    Add-on configuration wizard

    SPDX-License-Identifier: MIT
    See LICENSES/MIT.md for more information.
"""
import inputstreamhelper
from xbmc import getCondVisibility
from xbmcaddon import Addon
from xbmcgui import getScreenHeight, getScreenWidth

from resources.lib.common import (get_system_platform, is_device_4k_capable, get_local_string, json_rpc,
                                  get_supported_hdr_types, is_device_l1_enabled, is_android_tv)
from resources.lib.common.exceptions import InputStreamHelperError
from resources.lib.globals import G
from resources.lib.kodi.ui import show_ok_dialog, ask_for_confirmation
from resources.lib.utils.logging import LOG


def run_addon_configuration(restore=False):
    """
    Add-on configuration wizard,
    automatically configures profiles and add-ons dependencies, based on user-supplied data and device characteristics
    and restore to default some expert settings when requested
    """
    LOG.debug('Running add-on configuration wizard')
    _set_codec_profiles()
    _set_kodi_settings()
    _set_isa_addon_settings(get_system_platform() == 'android')

    # For L3 devices we disable by default the esn auto generation (1080p workaround)
    # see workaround details in the chunked_request method of msl_requests.py
    if get_system_platform() == 'android' and not is_device_l1_enabled():
        G.LOCAL_DB.set_value('esn_auto_generate', False)

    # Restore default settings that may have been misconfigured by the user
    if restore:
        G.ADDON.setSettingString('isa_streamselection_override', 'disabled')
        G.ADDON.setSettingString('stream_max_resolution', '--')
        G.ADDON.setSettingString('stream_force_hdcp', '--')
        G.ADDON.setSettingString('msl_manifest_version', 'default')
        G.ADDON.setSettingString('cdn_server', 'Server 1')

    # Enable UpNext if it is installed and enabled
    G.ADDON.setSettingBool('UpNextNotifier_enabled', getCondVisibility('System.AddonIsEnabled(service.upnext)'))
    if restore:
        show_ok_dialog(get_local_string(30154), get_local_string(30157))


def _set_isa_addon_settings(hdcp_override):
    """Method for self-configuring of InputStream Adaptive add-on"""
    try:
        is_helper = inputstreamhelper.Helper('mpd')
        if not is_helper.check_inputstream():
            show_ok_dialog(get_local_string(30154), get_local_string(30046))
            return
    except Exception as exc:  # pylint: disable=broad-except
        # Captures all types of ISH internal errors
        import traceback
        LOG.error(traceback.format_exc())
        raise InputStreamHelperError(str(exc)) from exc

    if G.KODI_VERSION < '20':
        # Only needed for Kodi <= v19, this has been fixed on Kodi 20
        isa_addon = Addon('inputstream.adaptive')
        isa_addon.setSettingBool('HDCPOVERRIDE', hdcp_override)
        if isa_addon.getSettingInt('STREAMSELECTION') == 1:
            # Stream selection must never be set to 'Manual' or cause problems with the streams
            isa_addon.setSettingInt('STREAMSELECTION', 0)
        # 'Ignore display' should only be set when Kodi display resolution is not 4K
        isa_addon.setSettingBool('IGNOREDISPLAY',
                                 is_device_4k_capable() and (getScreenWidth() != 3840 or getScreenHeight() != 2160))


def _set_codec_profiles():
    """Method for self-configuring of netflix manifest codec profiles"""
    enable_vp9_profiles = True
    enable_hevc_profiles = False
    if get_system_platform() == 'android':
        # We cannot determine the codecs supported by the device in advance so...
        # ...we do not enable VP9 because many older mobile devices do not support it
        enable_vp9_profiles = False
        # ...we enable HEVC by default on tv boxes and 4K capable devices
        enable_hevc_profiles = is_android_tv() or is_device_4k_capable()
        # Get supported HDR types by the display (configuration works from Kodi v20)
        supported_hdr_types = get_supported_hdr_types()
        if supported_hdr_types and enable_hevc_profiles: # for now only HEVC have HDR/DV
            is_hdr10_enabled = False
            is_dv_enabled = False
            # Ask to enable HDR10
            if 'hdr10' in supported_hdr_types:
                is_hdr10_enabled = ask_for_confirmation('Netflix', get_local_string(30742))
            # Ask to enable Dolby Vision
            if is_hdr10_enabled and 'dolbyvision' in supported_hdr_types:
                is_dv_enabled = ask_for_confirmation('Netflix', get_local_string(30743))
            G.ADDON.setSettingBool('enable_hdr_profiles', is_hdr10_enabled)
            G.ADDON.setSettingBool('enable_dolbyvision_profiles', is_dv_enabled)
    G.ADDON.setSettingBool('enable_vp9_profiles', enable_vp9_profiles)
    G.ADDON.setSettingBool('enable_vp9.2_profiles', False)
    G.ADDON.setSettingBool('enable_hevc_profiles', enable_hevc_profiles)
    G.ADDON.setSettingBool('enable_av1_profiles', False)
    G.ADDON.setSettingBool('disable_webvtt_subtitle', False)


def _set_kodi_settings():
    """Method for self-configuring Kodi settings"""
    if get_system_platform() == 'android':
        # Media Codec hardware acceleration is mandatory, otherwise only the audio stream is played
        try:
            json_rpc('Settings.SetSettingValue', {'setting': 'videoplayer.usemediacodecsurface', 'value': True})
            json_rpc('Settings.SetSettingValue', {'setting': 'videoplayer.usemediacodec', 'value': True})
        except IOError as exc:
            LOG.error('Changing Kodi settings caused the following error: {}', exc)