def alarmActive(self, camera_number): if Window(10000).getProperty('SR_alarmActive_%s' % camera_number) == '1': return True return False
def get_property(key, window_id=10000): """Get a Window property""" return to_unicode(Window(window_id).getProperty(key))
def clear_property(key, window_id=10000): """Clear a Window property""" return Window(window_id).clearProperty(key)
def openRequested_manual(self, camera_number): if Window(10000).getProperty('SR_openRequest_manual_%s' % camera_number) == '1': return True return False
def play_video(video_id, client_data, stream_type, season_id=None, compilation_id=None): from .mpd_parser import mpd_parser as mpd_parser from xbmc import getCondVisibility xbmc_helper().log_debug('play_video: video_id {}', video_id) succeeded = False list_item = ListItem() try: from .submodules.libjoyn_video import get_video_data video_data = get_video_data(video_id, loads(client_data), stream_type, season_id, compilation_id) xbmc_helper().log_debug('Got video data: {}', video_data.get('licenseUrl')) parser = video_data.get('parser', None) if parser is not None: list_item.setProperty('inputstreamaddon', CONST['INPUTSTREAM_ADDON']) # DASH if isinstance(parser, mpd_parser): list_item.setMimeType('application/dash+xml') list_item.setProperty( compat._format('{}.manifest_type', CONST['INPUTSTREAM_ADDON']), 'mpd') if parser.mpd_filepath is not None: list_item.setPath( parser.mpd_filepath if not getCondVisibility('System.Platform.Windows') and not getCondVisibility('System.Platform.UWP') else parser.mpd_filepath.replace('\\', '/')) elif parser.mpd_url is not None: list_item.setPath(lib_joyn().add_user_agent_http_header( parser.mpd_url)) else: raise ValueError( compat._format( 'Could not find a valid DASH Manifest - parser: {}', vars(mpd_parser))) drm = video_data.get('drm', '') license_key = video_data.get('licenseUrl', None) license_cert = video_data.get('certificateUrl', None) xbmc_helper().log_debug('drm: {} key: {} cert: {}', drm, license_key, license_cert) if license_key is not None: if drm.lower() == 'widevine': xbmc_helper().log_notice('Using Widevine as DRM') list_item.setProperty( compat._format('{}.license_type', CONST['INPUTSTREAM_ADDON']), 'com.widevine.alpha') list_item.setProperty( compat._format('{}.license_key', CONST['INPUTSTREAM_ADDON']), compat._format( '{}|{}|R{{SSM}}|', license_key, request_helper.get_header_string({ 'User-Agent': lib_joyn().config.get('USER_AGENT'), 'Content-Type': 'application/octet-stream' }))) list_item.setProperty( compat._format('{}.stream_headers', CONST['INPUTSTREAM_ADDON']), request_helper.get_header_string({ 'User-Agent': lib_joyn().config['USER_AGENT'] })) if license_cert is not None and xbmc_helper( ).get_bool_setting('checkdrmcert') is True: xbmc_helper().log_debug('Set DRM cert: {}', license_cert) list_item.setProperty( compat._format('{}.server_certificate', CONST['INPUTSTREAM_ADDON']), lib_joyn().add_user_agent_http_header( license_cert)) elif drm.lower() == 'playready': xbmc_helper().log_notice('Using PlayReady as DRM') list_item.setProperty( compat._format('{}.license_type', CONST['INPUTSTREAM_ADDON']), 'com.microsoft.playready') list_item.setProperty( compat._format('{}.license_key', CONST['INPUTSTREAM_ADDON']), compat._format( '{}|{}|R{{SSM}}|', license_key, request_helper.get_header_string({ 'User-Agent': CONST['EDGE_UA'], 'Content-Type': 'text/xml', 'SOAPAction': 'http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense' }))) list_item.setProperty( compat._format('{}.stream_headers', CONST['INPUTSTREAM_ADDON']), request_helper.get_header_string( {'User-Agent': CONST['EDGE_UA']})) else: raise ValueError( compat._format('Unsupported DRM {}', drm)) if stream_type == 'LIVE': list_item.setProperty( compat._format('{}.manifest_update_parameter', CONST['INPUTSTREAM_ADDON']), 'full') if xbmc_helper().get_bool_setting( 'fix_livestream_audio_sync') is True: mpd_timeshift_buffer = parser.get_timeshift_buffer_secs() if mpd_timeshift_buffer is not None: xbmc_helper().log_debug( 'Got timeshiftbuffer from mpd: {}', mpd_timeshift_buffer) live_stream_length = mpd_timeshift_buffer else: live_stream_length = xbmc_helper().get_int_setting( 'livestream_total_length') live_stream_resume_pos = live_stream_length - xbmc_helper( ).get_int_setting('livestream_offset') list_item.setProperty('TotalTime', str(float(live_stream_length))) list_item.setProperty('ResumeTime', str(float(live_stream_resume_pos))) xbmc_helper().log_debug( 'Tried fixing livestream audio sync issue - total time: {} - resume pos {}', live_stream_length, live_stream_resume_pos) succeeded = True from .submodules.plugin_lastseen import add_lastseen if 'season_id' in video_data.keys( ) and video_data['season_id'] is not None: add_lastseen(season_id=video_data['season_id'], max_lastseen=CONST['LASTSEEN_ITEM_COUNT']) elif 'compilation_id' in video_data.keys( ) and video_data['compilation_id'] is not None: add_lastseen(compilation_id=video_data['compilation_id'], max_lastseen=CONST['LASTSEEN_ITEM_COUNT']) else: raise ValueError(compat._format('Could not get parser: {}', parser)) except Exception as e: xbmc_helper().log_error( 'Getting videostream / manifest failed with Exception: {}', e) xbmc_helper().notification( compat._format(xbmc_helper().translation('ERROR'), 'Video-Stream'), xbmc_helper().translation('MSG_ERROR_NO_VIDEOSTEAM')) pass if succeeded is True and stream_type == 'VOD': from xbmcgui import Window, getCurrentWindowId Window(getCurrentWindowId()).setProperty('joyn_video_id', video_id) setResolvedUrl(pluginhandle, succeeded, list_item)
def set_alarmActive(self, camera_number): Window(10000).setProperty('SR_alarmActive_%s' % camera_number, '1')
def clear_closeRequest(self, camera_number): Window(10000).clearProperty('SR_closeRequest_%s' % camera_number)
def clear_playingCamera(self, camera_number): Window(10000).clearProperty('SR_playingCamera_%s' % camera_number)
def overrideURL(self, camera_number, url): Window(10000).setProperty('SR_urlOverride_%s' % camera_number, url)
def toggledPreview(self): if Window(10000).getProperty('SR_togglePreview') == '1': return True return False
def set_playingCamera(self, camera_number): Window(10000).setProperty('SR_playingCamera_%s' % camera_number, '1') self.dismissAllPreviews()
def previewOpened(self, camera_number): if Window(10000).getProperty('SR_openPreview_%s' % camera_number) == '1': return True return False
def closePreview(self, camera_number): self.clear_openRequest(camera_number) self.clear_openRequest_manual(camera_number) Window(10000).clearProperty('SR_openPreview_%s' % camera_number) self.clear_closeRequest(camera_number)
def openPreview(self, camera_number): self.clear_closeRequest(camera_number) Window(10000).setProperty('SR_openPreview_%s' % camera_number, '1') self.clear_openRequest(camera_number)
def openRequest_manual(self, camera_number): Window(10000).setProperty('SR_openRequest_manual_%s' % camera_number, '1') self.openRequest(camera_number)
def clear_overrideURL(self, camera_number): Window(10000).clearProperty('SR_urlOverride_%s' % camera_number)
def closeRequest(self, camera_number): Window(10000).setProperty('SR_closeRequest_%s' % camera_number, '1')
def get_overrideURL(self, camera_number): return Window(10000).getProperty('SR_urlOverride_%s' % camera_number)
def clear_openRequest_manual(self, camera_number): Window(10000).clearProperty('SR_openRequest_manual_%s' % camera_number)
def resume_previous_file(self): if settings.getSetting_bool('resume') and Window(10000).getProperty( 'SR_previousFile') != '': return True return False
def clear_alarmActive(self, camera_number): Window(10000).clearProperty('SR_alarmActive_%s' % camera_number)
def stop(self): Window(10000).clearProperty('SR_monitor')
def closeRequested(self, camera_number): if Window(10000).getProperty('SR_closeRequest_%s' % camera_number) == '1': return True return False
def stopped(self): if Window(10000).getProperty('SR_monitor') == '1': return False return True
def window(): id = wid() return Window(id) if id else None
def write_testResult(self, camera_number, success_code): if success_code == 0: Window(10000).setProperty('SR_result_%s' % camera_number, '1') else: Window(10000).clearProperty('SR_result_%s' % camera_number)
def set_property(key, value, window_id=10000): """Set a Window property""" return Window(window_id).setProperty(key, from_unicode(str(value)))
def testResult(self, camera_number): if Window(10000).getProperty('SR_result_%s' % camera_number) == '1': return True return False
from urllib import urlencode from xbmc import getCondVisibility, sleep from xbmcgui import Window ############################################################################### def _get_kodi_type(): kodi_type = listitem.getVideoInfoTag().getMediaType().decode('utf-8') if not kodi_type: if getCondVisibility('Container.Content(albums)'): kodi_type = "album" elif getCondVisibility('Container.Content(artists)'): kodi_type = "artist" elif getCondVisibility('Container.Content(songs)'): kodi_type = "song" elif getCondVisibility('Container.Content(pictures)'): kodi_type = "picture" return kodi_type if __name__ == "__main__": WINDOW = Window(10000) KODI_ID = listitem.getVideoInfoTag().getDbId() KODI_TYPE = _get_kodi_type() ARGS = {'kodi_id': KODI_ID, 'kodi_type': KODI_TYPE} while WINDOW.getProperty('plex_command'): sleep(20) WINDOW.setProperty('plex_command', 'CONTEXT_menu?%s' % urlencode(ARGS))
def clear_property(key, window_id=10000): ''' Clear a Window property ''' return Window(window_id).clearProperty(key)