Merge branch 'hotfixes' into translations
|
@ -1,5 +1,5 @@
|
||||||
[![stable version](https://img.shields.io/badge/stable_version-1.8.18-blue.svg?maxAge=60&style=flat) ](https://github.com/croneter/binary_repo/raw/master/stable/repository.plexkodiconnect/repository.plexkodiconnect-1.0.2.zip)
|
[![stable version](https://img.shields.io/badge/stable_version-1.8.18-blue.svg?maxAge=60&style=flat) ](https://github.com/croneter/binary_repo/raw/master/stable/repository.plexkodiconnect/repository.plexkodiconnect-1.0.2.zip)
|
||||||
[![beta version](https://img.shields.io/badge/beta_version-2.0.22-red.svg?maxAge=60&style=flat) ](https://github.com/croneter/binary_repo/raw/master/beta/repository.plexkodiconnectbeta/repository.plexkodiconnectbeta-1.0.2.zip)
|
[![beta version](https://img.shields.io/badge/beta_version-2.0.26-red.svg?maxAge=60&style=flat) ](https://github.com/croneter/binary_repo/raw/master/beta/repository.plexkodiconnectbeta/repository.plexkodiconnectbeta-1.0.2.zip)
|
||||||
|
|
||||||
[![Installation](https://img.shields.io/badge/wiki-installation-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/Installation)
|
[![Installation](https://img.shields.io/badge/wiki-installation-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/Installation)
|
||||||
[![FAQ](https://img.shields.io/badge/wiki-FAQ-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/faq)
|
[![FAQ](https://img.shields.io/badge/wiki-FAQ-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/faq)
|
||||||
|
|
34
addon.xml
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<addon id="plugin.video.plexkodiconnect" name="PlexKodiConnect" version="2.0.22" provider-name="croneter">
|
<addon id="plugin.video.plexkodiconnect" name="PlexKodiConnect" version="2.0.26" provider-name="croneter">
|
||||||
<requires>
|
<requires>
|
||||||
<import addon="xbmc.python" version="2.1.0"/>
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
<import addon="script.module.requests" version="2.9.1" />
|
<import addon="script.module.requests" version="2.9.1" />
|
||||||
|
@ -67,7 +67,37 @@
|
||||||
<summary lang="ru_RU">Нативная интеграция сервера Plex в Kodi</summary>
|
<summary lang="ru_RU">Нативная интеграция сервера Plex в Kodi</summary>
|
||||||
<description lang="ru_RU">Подключите Kodi к своему серверу Plex. Плагин предполагает что вы управляете своими видео с помощью Plex (а не в Kodi). Вы можете потерять текущие базы данных музыки и видео в Kodi (так как плагин напрямую их изменяет). Используйте на свой страх и риск</description>
|
<description lang="ru_RU">Подключите Kodi к своему серверу Plex. Плагин предполагает что вы управляете своими видео с помощью Plex (а не в Kodi). Вы можете потерять текущие базы данных музыки и видео в Kodi (так как плагин напрямую их изменяет). Используйте на свой страх и риск</description>
|
||||||
<disclaimer lang="ru_RU">Используйте на свой страх и риск</disclaimer>
|
<disclaimer lang="ru_RU">Используйте на свой страх и риск</disclaimer>
|
||||||
<news>version 2.0.22 (beta only):
|
<news>version 2.0.26 (beta only):
|
||||||
|
- Reduce CPU strain for artwork caching progress
|
||||||
|
- Fallback connection if plex.direct does not resolve
|
||||||
|
- Prettify Plex context menu, thanks @dazedcrazy
|
||||||
|
- Default to not show image caching notifications
|
||||||
|
|
||||||
|
version 2.0.25 (beta only):
|
||||||
|
- Fix migration not working correctly for re-connecting PMS
|
||||||
|
- Fix PMS showing up twice
|
||||||
|
- Improve artwork caching counter in PKC settings
|
||||||
|
|
||||||
|
version 2.0.24 (beta only):
|
||||||
|
- WARNING: You will need to reset the Kodi database! Sorry for that...
|
||||||
|
- PKC will force you to re-connect with your PMS
|
||||||
|
- Use plex.direct url instead of local ip to use correct SSL certificate; thus fix artwork caching
|
||||||
|
- Revert "Increase timeout between syncing images"
|
||||||
|
- Don't ask user for DB reset if forced by PKC
|
||||||
|
- Ensure movies and tv shows are synced before music
|
||||||
|
- Ensure a later migration if user downgraded PKC
|
||||||
|
|
||||||
|
version 2.0.23 (beta only):
|
||||||
|
- WARNING: You will need to reset the Kodi database!
|
||||||
|
- Finally support for Extras!
|
||||||
|
- Fix context menu not working for shows in library view
|
||||||
|
- Fix Plex Companion music playstate status for iOS
|
||||||
|
- Show caching progress and FanartTV lookup progress in PKC settings
|
||||||
|
- Fix rare library sync errors
|
||||||
|
- Fix ValueError for third party add-ons calling PKC
|
||||||
|
- Tweak PKC settings
|
||||||
|
|
||||||
|
version 2.0.22 (beta only):
|
||||||
- Fix Recently Added for tv shows not working
|
- Fix Recently Added for tv shows not working
|
||||||
- Fix PKC crashing on startup
|
- Fix PKC crashing on startup
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,33 @@
|
||||||
|
version 2.0.26 (beta only):
|
||||||
|
- Reduce CPU strain for artwork caching progress
|
||||||
|
- Fallback connection if plex.direct does not resolve
|
||||||
|
- Prettify Plex context menu, thanks @dazedcrazy
|
||||||
|
- Default to not show image caching notifications
|
||||||
|
|
||||||
|
version 2.0.25 (beta only):
|
||||||
|
- Fix migration not working correctly for re-connecting PMS
|
||||||
|
- Fix PMS showing up twice
|
||||||
|
- Improve artwork caching counter in PKC settings
|
||||||
|
|
||||||
|
version 2.0.24 (beta only):
|
||||||
|
- WARNING: You will need to reset the Kodi database! Sorry for that...
|
||||||
|
- PKC will force you to re-connect with your PMS
|
||||||
|
- Use plex.direct url instead of local ip to use correct SSL certificate; thus fix artwork caching
|
||||||
|
- Revert "Increase timeout between syncing images"
|
||||||
|
- Don't ask user for DB reset if forced by PKC
|
||||||
|
- Ensure movies and tv shows are synced before music
|
||||||
|
- Ensure a later migration if user downgraded PKC
|
||||||
|
|
||||||
|
version 2.0.23 (beta only):
|
||||||
|
- WARNING: You will need to reset the Kodi database!
|
||||||
|
- Finally support for Extras!
|
||||||
|
- Fix context menu not working for shows in library view
|
||||||
|
- Fix Plex Companion music playstate status for iOS
|
||||||
|
- Show caching progress and FanartTV lookup progress in PKC settings
|
||||||
|
- Fix rare library sync errors
|
||||||
|
- Fix ValueError for third party add-ons calling PKC
|
||||||
|
- Tweak PKC settings
|
||||||
|
|
||||||
version 2.0.22 (beta only):
|
version 2.0.22 (beta only):
|
||||||
- Fix Recently Added for tv shows not working
|
- Fix Recently Added for tv shows not working
|
||||||
- Fix PKC crashing on startup
|
- Fix PKC crashing on startup
|
||||||
|
|
1496
resources/language/resource.language.cs_CZ/strings.po.orig
Normal file
|
@ -15,7 +15,6 @@ msgstr ""
|
||||||
|
|
||||||
# Add-on settings
|
# Add-on settings
|
||||||
|
|
||||||
|
|
||||||
msgctxt "#29999"
|
msgctxt "#29999"
|
||||||
msgid "PlexKodiConnect"
|
msgid "PlexKodiConnect"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
1498
resources/language/resource.language.ru_RU/strings.po.orig
Normal file
|
@ -20,6 +20,7 @@ LOG = getLogger("PLEX." + __name__)
|
||||||
|
|
||||||
CONTAINERSIZE = int(settings('limitindex'))
|
CONTAINERSIZE = int(settings('limitindex'))
|
||||||
REGEX_PLEX_KEY = re_compile(r'''/(.+)/(\d+)$''')
|
REGEX_PLEX_KEY = re_compile(r'''/(.+)/(\d+)$''')
|
||||||
|
REGEX_PLEX_DIRECT = re_compile(r'''\.plex\.direct:\d+$''')
|
||||||
|
|
||||||
# For discovery of PMS in the local LAN
|
# For discovery of PMS in the local LAN
|
||||||
PLEX_GDM_IP = '239.0.0.250' # multicast to PMS
|
PLEX_GDM_IP = '239.0.0.250' # multicast to PMS
|
||||||
|
@ -212,38 +213,28 @@ def discover_pms(token=None):
|
||||||
LOG.info('No plex token supplied, only checked LAN for available PMS')
|
LOG.info('No plex token supplied, only checked LAN for available PMS')
|
||||||
plex_pms_list = []
|
plex_pms_list = []
|
||||||
|
|
||||||
# See if we found a PMS both locally and using plex.tv. If so, use local
|
# Add PMS found only in the LAN to the Plex.tv PMS list
|
||||||
# connection data
|
|
||||||
all_pms = []
|
|
||||||
for pms in local_pms_list:
|
for pms in local_pms_list:
|
||||||
for i, plex_pms in enumerate(plex_pms_list):
|
for plex_pms in plex_pms_list:
|
||||||
if pms['machineIdentifier'] == plex_pms['machineIdentifier']:
|
if pms['machineIdentifier'] == plex_pms['machineIdentifier']:
|
||||||
# Update with GDM data - potentially more reliable than plex.tv
|
|
||||||
LOG.debug('Found this PMS also in the LAN: %s', plex_pms)
|
|
||||||
plex_pms['ip'] = pms['ip']
|
|
||||||
plex_pms['port'] = pms['port']
|
|
||||||
plex_pms['local'] = True
|
|
||||||
# Use all the other data we know from plex.tv
|
|
||||||
pms = plex_pms
|
|
||||||
# Remove this particular pms since we already know it
|
|
||||||
plex_pms_list.pop(i)
|
|
||||||
break
|
break
|
||||||
|
else:
|
||||||
|
# Only found PMS using GDM - add it to the PMS from plex.tv
|
||||||
https = _pms_https_enabled('%s:%s' % (pms['ip'], pms['port']))
|
https = _pms_https_enabled('%s:%s' % (pms['ip'], pms['port']))
|
||||||
if https is None:
|
if https is None:
|
||||||
# Error contacting url. Skip and ignore this PMS for now
|
# Error contacting url. Skip and ignore this PMS for now
|
||||||
|
LOG.error('Could not contact PMS %s but we should have', pms)
|
||||||
continue
|
continue
|
||||||
elif https is True:
|
elif https is True:
|
||||||
pms['scheme'] = 'https'
|
pms['scheme'] = 'https'
|
||||||
pms['baseURL'] = 'https://%s:%s' % (pms['ip'], pms['port'])
|
|
||||||
else:
|
else:
|
||||||
pms['scheme'] = 'http'
|
pms['scheme'] = 'http'
|
||||||
pms['baseURL'] = 'http://%s:%s' % (pms['ip'], pms['port'])
|
pms['baseURL'] = '%s://%s:%s' % (pms['scheme'],
|
||||||
all_pms.append(pms)
|
pms['ip'],
|
||||||
# Now add the remaining PMS from plex.tv (where we already checked connect.)
|
pms['port'])
|
||||||
for plex_pms in plex_pms_list:
|
plex_pms_list.append(pms)
|
||||||
all_pms.append(plex_pms)
|
LOG.debug('Found the following PMS in total: %s', plex_pms_list)
|
||||||
LOG.debug('Found the following PMS in total: %s', all_pms)
|
return plex_pms_list
|
||||||
return all_pms
|
|
||||||
|
|
||||||
|
|
||||||
def _plex_gdm():
|
def _plex_gdm():
|
||||||
|
@ -414,15 +405,16 @@ def _pms_list_from_plex_tv(token):
|
||||||
|
|
||||||
def _poke_pms(pms, queue):
|
def _poke_pms(pms, queue):
|
||||||
data = pms['connections'][0].attrib
|
data = pms['connections'][0].attrib
|
||||||
if data['local'] == '1':
|
|
||||||
protocol = data['protocol']
|
|
||||||
address = data['address']
|
|
||||||
port = data['port']
|
|
||||||
url = '%s://%s:%s' % (protocol, address, port)
|
|
||||||
else:
|
|
||||||
url = data['uri']
|
url = data['uri']
|
||||||
if url.count(':') == 1:
|
if data['local'] == '1' and REGEX_PLEX_DIRECT.findall(url):
|
||||||
url = '%s:%s' % (url, data['port'])
|
# In case DNS resolve of plex.direct does not work, append a new
|
||||||
|
# connection that will directly access the local IP (e.g. internet down)
|
||||||
|
conn = deepcopy(pms['connections'][0])
|
||||||
|
# Overwrite plex.direct
|
||||||
|
conn.attrib['uri'] = '%s://%s:%s' % (data['protocol'],
|
||||||
|
data['address'],
|
||||||
|
data['port'])
|
||||||
|
pms['connections'].insert(1, conn)
|
||||||
protocol, address, port = url.split(':', 2)
|
protocol, address, port = url.split(':', 2)
|
||||||
address = address.replace('/', '')
|
address = address.replace('/', '')
|
||||||
xml = DU().downloadUrl('%s/identity' % url,
|
xml = DU().downloadUrl('%s/identity' % url,
|
||||||
|
|
|
@ -39,7 +39,7 @@ def double_urldecode(text):
|
||||||
|
|
||||||
@thread_methods(add_suspends=IMAGE_CACHING_SUSPENDS)
|
@thread_methods(add_suspends=IMAGE_CACHING_SUSPENDS)
|
||||||
class Image_Cache_Thread(Thread):
|
class Image_Cache_Thread(Thread):
|
||||||
sleep_between = 200
|
sleep_between = 50
|
||||||
# Potentially issues with limited number of threads
|
# Potentially issues with limited number of threads
|
||||||
# Hence let Kodi wait till download is successful
|
# Hence let Kodi wait till download is successful
|
||||||
timeout = (35.1, 35.1)
|
timeout = (35.1, 35.1)
|
||||||
|
@ -54,6 +54,8 @@ class Image_Cache_Thread(Thread):
|
||||||
suspended = self.suspended
|
suspended = self.suspended
|
||||||
queue = self.queue
|
queue = self.queue
|
||||||
sleep_between = self.sleep_between
|
sleep_between = self.sleep_between
|
||||||
|
counter = 0
|
||||||
|
set_zero = False
|
||||||
while not stopped():
|
while not stopped():
|
||||||
# In the event the server goes offline
|
# In the event the server goes offline
|
||||||
while suspended():
|
while suspended():
|
||||||
|
@ -63,21 +65,19 @@ class Image_Cache_Thread(Thread):
|
||||||
LOG.info("---===### Stopped Image_Cache_Thread ###===---")
|
LOG.info("---===### Stopped Image_Cache_Thread ###===---")
|
||||||
return
|
return
|
||||||
sleep(1000)
|
sleep(1000)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
url = queue.get(block=False)
|
url = queue.get(block=False)
|
||||||
except Empty:
|
except Empty:
|
||||||
|
if not set_zero:
|
||||||
|
# Avoid saving '0' all the time
|
||||||
|
set_zero = True
|
||||||
|
settings('caching_artwork_count', value='0')
|
||||||
sleep(1000)
|
sleep(1000)
|
||||||
continue
|
continue
|
||||||
|
set_zero = False
|
||||||
if isinstance(url, ArtworkSyncMessage):
|
if isinstance(url, ArtworkSyncMessage):
|
||||||
if url.artwork_counter is not None:
|
if state.IMAGE_SYNC_NOTIFICATIONS:
|
||||||
if url.artwork_counter == 0:
|
|
||||||
# Done caching, show this in the PKC settings, too
|
|
||||||
settings('caching_major_artwork', value=lang(30069))
|
|
||||||
LOG.info('Done caching major images!')
|
|
||||||
else:
|
|
||||||
settings('caching_major_artwork',
|
|
||||||
value=str(url.artwork_counter))
|
|
||||||
if url.message and state.IMAGE_SYNC_NOTIFICATIONS:
|
|
||||||
dialog('notification',
|
dialog('notification',
|
||||||
heading=lang(29999),
|
heading=lang(29999),
|
||||||
message=url.message,
|
message=url.message,
|
||||||
|
@ -127,6 +127,11 @@ class Image_Cache_Thread(Thread):
|
||||||
# We did not even get a timeout
|
# We did not even get a timeout
|
||||||
break
|
break
|
||||||
queue.task_done()
|
queue.task_done()
|
||||||
|
# Update the caching state in the PKC settings.
|
||||||
|
counter += 1
|
||||||
|
if counter > 20:
|
||||||
|
counter = 0
|
||||||
|
settings('caching_artwork_count', value=str(queue.qsize()))
|
||||||
# Sleep for a bit to reduce CPU strain
|
# Sleep for a bit to reduce CPU strain
|
||||||
sleep(sleep_between)
|
sleep(sleep_between)
|
||||||
LOG.info("---===### Stopped Image_Cache_Thread ###===---")
|
LOG.info("---===### Stopped Image_Cache_Thread ###===---")
|
||||||
|
@ -168,24 +173,18 @@ class Artwork():
|
||||||
if not artworks_to_cache:
|
if not artworks_to_cache:
|
||||||
LOG.info('Caching of major images to Kodi texture cache done')
|
LOG.info('Caching of major images to Kodi texture cache done')
|
||||||
# Set to "None"
|
# Set to "None"
|
||||||
settings('caching_major_artwork', value=lang(30069))
|
settings('caching_artwork_count', value=lang(30069))
|
||||||
return
|
return
|
||||||
length = len(artworks_to_cache)
|
length = len(artworks_to_cache)
|
||||||
LOG.info('Caching has not been completed - caching %s major images',
|
LOG.info('Caching has not been completed - caching %s major images',
|
||||||
length)
|
length)
|
||||||
settings('caching_major_artwork', value=str(length))
|
settings('caching_artwork_count', value=str(length))
|
||||||
# Caching %s Plex images
|
# Caching %s Plex images
|
||||||
self.queue.put(ArtworkSyncMessage(message=lang(30006) % length,
|
self.queue.put(ArtworkSyncMessage(lang(30006) % length))
|
||||||
artwork_counter=length))
|
|
||||||
for i, url in enumerate(artworks_to_cache):
|
for i, url in enumerate(artworks_to_cache):
|
||||||
self.queue.put(url[0])
|
self.queue.put(url[0])
|
||||||
if (length - i) % 10 == 0:
|
|
||||||
# Update the PKC settings for artwork caching progress
|
|
||||||
msg = ArtworkSyncMessage(artwork_counter=length - i)
|
|
||||||
self.queue.put(msg)
|
|
||||||
# Plex image caching done
|
# Plex image caching done
|
||||||
self.queue.put(ArtworkSyncMessage(message=lang(30007),
|
self.queue.put(ArtworkSyncMessage(lang(30007)))
|
||||||
artwork_counter=0))
|
|
||||||
|
|
||||||
def fullTextureCacheSync(self):
|
def fullTextureCacheSync(self):
|
||||||
"""
|
"""
|
||||||
|
@ -343,6 +342,5 @@ class ArtworkSyncMessage(object):
|
||||||
"""
|
"""
|
||||||
Put in artwork queue to display the message as a Kodi notification
|
Put in artwork queue to display the message as a Kodi notification
|
||||||
"""
|
"""
|
||||||
def __init__(self, message=None, artwork_counter=None):
|
def __init__(self, message):
|
||||||
self.message = message
|
self.message = message
|
||||||
self.artwork_counter = artwork_counter
|
|
||||||
|
|
|
@ -6,10 +6,10 @@ from xbmcaddon import Addon
|
||||||
import xbmc
|
import xbmc
|
||||||
import xbmcplugin
|
import xbmcplugin
|
||||||
import xbmcgui
|
import xbmcgui
|
||||||
|
import context
|
||||||
|
|
||||||
import plexdb_functions as plexdb
|
import plexdb_functions as plexdb
|
||||||
from utils import window, settings, dialog, language as lang
|
from utils import window, settings, dialog, language as lang
|
||||||
from dialogs import context
|
|
||||||
import PlexFunctions as PF
|
import PlexFunctions as PF
|
||||||
from PlexAPI import API
|
from PlexAPI import API
|
||||||
import playqueue as PQ
|
import playqueue as PQ
|
||||||
|
@ -96,18 +96,7 @@ class ContextMenu(object):
|
||||||
options.append(OPTIONS['PMS_Play'])
|
options.append(OPTIONS['PMS_Play'])
|
||||||
if self.kodi_type in v.KODI_VIDEOTYPES:
|
if self.kodi_type in v.KODI_VIDEOTYPES:
|
||||||
options.append(OPTIONS['Transcode'])
|
options.append(OPTIONS['Transcode'])
|
||||||
# userdata = self.api.userdata()
|
|
||||||
# if userdata['Favorite']:
|
|
||||||
# # Remove from emby favourites
|
|
||||||
# options.append(OPTIONS['RemoveFav'])
|
|
||||||
# else:
|
|
||||||
# # Add to emby favourites
|
|
||||||
# options.append(OPTIONS['AddFav'])
|
|
||||||
# if self.kodi_type == "song":
|
|
||||||
# # Set custom song rating
|
|
||||||
# options.append(OPTIONS['RateSong'])
|
|
||||||
# Refresh item
|
|
||||||
# options.append(OPTIONS['Refresh'])
|
|
||||||
# Delete item, only if the Plex Home main user is logged in
|
# Delete item, only if the Plex Home main user is logged in
|
||||||
if (window('plex_restricteduser') != 'true' and
|
if (window('plex_restricteduser') != 'true' and
|
||||||
window('plex_allows_mediaDeletion') == 'true'):
|
window('plex_allows_mediaDeletion') == 'true'):
|
||||||
|
@ -115,7 +104,7 @@ class ContextMenu(object):
|
||||||
# Addon settings
|
# Addon settings
|
||||||
options.append(OPTIONS['Addon'])
|
options.append(OPTIONS['Addon'])
|
||||||
context_menu = context.ContextMenu(
|
context_menu = context.ContextMenu(
|
||||||
"script-emby-context.xml",
|
"script-plex-context.xml",
|
||||||
Addon('plugin.video.plexkodiconnect').getAddonInfo('path'),
|
Addon('plugin.video.plexkodiconnect').getAddonInfo('path'),
|
||||||
"default",
|
"default",
|
||||||
"1080i")
|
"1080i")
|
||||||
|
@ -137,14 +126,7 @@ class ContextMenu(object):
|
||||||
self._PMS_play()
|
self._PMS_play()
|
||||||
elif selected == OPTIONS['Extras']:
|
elif selected == OPTIONS['Extras']:
|
||||||
self._extras()
|
self._extras()
|
||||||
# elif selected == OPTIONS['Refresh']:
|
|
||||||
# self.emby.refreshItem(self.item_id)
|
|
||||||
# elif selected == OPTIONS['AddFav']:
|
|
||||||
# self.emby.updateUserRating(self.item_id, favourite=True)
|
|
||||||
# elif selected == OPTIONS['RemoveFav']:
|
|
||||||
# self.emby.updateUserRating(self.item_id, favourite=False)
|
|
||||||
# elif selected == OPTIONS['RateSong']:
|
|
||||||
# self._rate_song()
|
|
||||||
elif selected == OPTIONS['Addon']:
|
elif selected == OPTIONS['Addon']:
|
||||||
xbmc.executebuiltin(
|
xbmc.executebuiltin(
|
||||||
'Addon.OpenSettings(plugin.video.plexkodiconnect)')
|
'Addon.OpenSettings(plugin.video.plexkodiconnect)')
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
# Dummy file to make this directory a package.
|
|
||||||
# from serverconnect import ServerConnect
|
|
||||||
# from usersconnect import UsersConnect
|
|
||||||
# from loginconnect import LoginConnect
|
|
||||||
# from loginmanual import LoginManual
|
|
||||||
# from servermanual import ServerManual
|
|
|
@ -1,136 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
|
|
||||||
import xbmcgui
|
|
||||||
import xbmcaddon
|
|
||||||
|
|
||||||
from utils import language as lang
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
log = logging.getLogger("EMBY."+__name__)
|
|
||||||
addon = xbmcaddon.Addon('plugin.video.emby')
|
|
||||||
|
|
||||||
ACTION_PARENT_DIR = 9
|
|
||||||
ACTION_PREVIOUS_MENU = 10
|
|
||||||
ACTION_BACK = 92
|
|
||||||
SIGN_IN = 200
|
|
||||||
CANCEL = 201
|
|
||||||
ERROR_TOGGLE = 202
|
|
||||||
ERROR_MSG = 203
|
|
||||||
ERROR = {
|
|
||||||
'Invalid': 1,
|
|
||||||
'Empty': 2
|
|
||||||
}
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
class LoginConnect(xbmcgui.WindowXMLDialog):
|
|
||||||
|
|
||||||
_user = None
|
|
||||||
error = None
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
|
|
||||||
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
|
|
||||||
|
|
||||||
def set_connect_manager(self, connect_manager):
|
|
||||||
self.connect_manager = connect_manager
|
|
||||||
|
|
||||||
def is_logged_in(self):
|
|
||||||
return True if self._user else False
|
|
||||||
|
|
||||||
def get_user(self):
|
|
||||||
return self._user
|
|
||||||
|
|
||||||
|
|
||||||
def onInit(self):
|
|
||||||
|
|
||||||
self.user_field = self._add_editcontrol(725, 385, 40, 500)
|
|
||||||
self.setFocus(self.user_field)
|
|
||||||
self.password_field = self._add_editcontrol(725, 470, 40, 500, password=1)
|
|
||||||
self.signin_button = self.getControl(SIGN_IN)
|
|
||||||
self.remind_button = self.getControl(CANCEL)
|
|
||||||
self.error_toggle = self.getControl(ERROR_TOGGLE)
|
|
||||||
self.error_msg = self.getControl(ERROR_MSG)
|
|
||||||
|
|
||||||
self.user_field.controlUp(self.remind_button)
|
|
||||||
self.user_field.controlDown(self.password_field)
|
|
||||||
self.password_field.controlUp(self.user_field)
|
|
||||||
self.password_field.controlDown(self.signin_button)
|
|
||||||
self.signin_button.controlUp(self.password_field)
|
|
||||||
self.remind_button.controlDown(self.user_field)
|
|
||||||
|
|
||||||
def onClick(self, control):
|
|
||||||
|
|
||||||
if control == SIGN_IN:
|
|
||||||
# Sign in to emby connect
|
|
||||||
self._disable_error()
|
|
||||||
|
|
||||||
user = self.user_field.getText()
|
|
||||||
password = self.password_field.getText()
|
|
||||||
|
|
||||||
if not user or not password:
|
|
||||||
# Display error
|
|
||||||
self._error(ERROR['Empty'], lang(30608))
|
|
||||||
log.error("Username or password cannot be null")
|
|
||||||
|
|
||||||
elif self._login(user, password):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
elif control == CANCEL:
|
|
||||||
# Remind me later
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def onAction(self, action):
|
|
||||||
|
|
||||||
if (self.error == ERROR['Empty']
|
|
||||||
and self.user_field.getText() and self.password_field.getText()):
|
|
||||||
self._disable_error()
|
|
||||||
|
|
||||||
if action in (ACTION_BACK, ACTION_PARENT_DIR, ACTION_PREVIOUS_MENU):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def _add_editcontrol(self, x, y, height, width, password=0):
|
|
||||||
|
|
||||||
media = os.path.join(addon.getAddonInfo('path'), 'resources', 'skins', 'default', 'media')
|
|
||||||
control = xbmcgui.ControlEdit(0, 0, 0, 0,
|
|
||||||
label="User",
|
|
||||||
font="font10",
|
|
||||||
textColor="ff525252",
|
|
||||||
focusTexture=os.path.join(media, "button-focus.png"),
|
|
||||||
noFocusTexture=os.path.join(media, "button-focus.png"),
|
|
||||||
isPassword=password)
|
|
||||||
control.setPosition(x, y)
|
|
||||||
control.setHeight(height)
|
|
||||||
control.setWidth(width)
|
|
||||||
|
|
||||||
self.addControl(control)
|
|
||||||
return control
|
|
||||||
|
|
||||||
def _login(self, username, password):
|
|
||||||
|
|
||||||
result = self.connect_manager.loginToConnect(username, password)
|
|
||||||
if result is False:
|
|
||||||
self._error(ERROR['Invalid'], lang(33009))
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
self._user = result
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _error(self, state, message):
|
|
||||||
|
|
||||||
self.error = state
|
|
||||||
self.error_msg.setLabel(message)
|
|
||||||
self.error_toggle.setVisibleCondition('True')
|
|
||||||
|
|
||||||
def _disable_error(self):
|
|
||||||
|
|
||||||
self.error = None
|
|
||||||
self.error_toggle.setVisibleCondition('False')
|
|
|
@ -1,145 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
|
|
||||||
import xbmcgui
|
|
||||||
import xbmcaddon
|
|
||||||
|
|
||||||
import read_embyserver as embyserver
|
|
||||||
from utils import language as lang
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
log = logging.getLogger("EMBY."+__name__)
|
|
||||||
addon = xbmcaddon.Addon('plugin.video.emby')
|
|
||||||
|
|
||||||
ACTION_PARENT_DIR = 9
|
|
||||||
ACTION_PREVIOUS_MENU = 10
|
|
||||||
ACTION_BACK = 92
|
|
||||||
SIGN_IN = 200
|
|
||||||
CANCEL = 201
|
|
||||||
ERROR_TOGGLE = 202
|
|
||||||
ERROR_MSG = 203
|
|
||||||
ERROR = {
|
|
||||||
'Invalid': 1,
|
|
||||||
'Empty': 2
|
|
||||||
}
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
class LoginManual(xbmcgui.WindowXMLDialog):
|
|
||||||
|
|
||||||
_user = None
|
|
||||||
error = None
|
|
||||||
username = None
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
|
|
||||||
self.emby = embyserver.Read_EmbyServer()
|
|
||||||
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
|
|
||||||
|
|
||||||
def is_logged_in(self):
|
|
||||||
return True if self._user else False
|
|
||||||
|
|
||||||
def set_server(self, server):
|
|
||||||
self.server = server
|
|
||||||
|
|
||||||
def set_user(self, user):
|
|
||||||
self.username = user or {}
|
|
||||||
|
|
||||||
def get_user(self):
|
|
||||||
return self._user
|
|
||||||
|
|
||||||
def onInit(self):
|
|
||||||
|
|
||||||
self.signin_button = self.getControl(SIGN_IN)
|
|
||||||
self.cancel_button = self.getControl(CANCEL)
|
|
||||||
self.error_toggle = self.getControl(ERROR_TOGGLE)
|
|
||||||
self.error_msg = self.getControl(ERROR_MSG)
|
|
||||||
self.user_field = self._add_editcontrol(725, 400, 40, 500)
|
|
||||||
self.password_field = self._add_editcontrol(725, 475, 40, 500, password=1)
|
|
||||||
|
|
||||||
if self.username:
|
|
||||||
self.user_field.setText(self.username)
|
|
||||||
self.setFocus(self.password_field)
|
|
||||||
else:
|
|
||||||
self.setFocus(self.user_field)
|
|
||||||
|
|
||||||
self.user_field.controlUp(self.cancel_button)
|
|
||||||
self.user_field.controlDown(self.password_field)
|
|
||||||
self.password_field.controlUp(self.user_field)
|
|
||||||
self.password_field.controlDown(self.signin_button)
|
|
||||||
self.signin_button.controlUp(self.password_field)
|
|
||||||
self.cancel_button.controlDown(self.user_field)
|
|
||||||
|
|
||||||
def onClick(self, control):
|
|
||||||
|
|
||||||
if control == SIGN_IN:
|
|
||||||
# Sign in to emby connect
|
|
||||||
self._disable_error()
|
|
||||||
|
|
||||||
user = self.user_field.getText()
|
|
||||||
password = self.password_field.getText()
|
|
||||||
|
|
||||||
if not user:
|
|
||||||
# Display error
|
|
||||||
self._error(ERROR['Empty'], lang(30613))
|
|
||||||
log.error("Username cannot be null")
|
|
||||||
|
|
||||||
elif self._login(user, password):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
elif control == CANCEL:
|
|
||||||
# Remind me later
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def onAction(self, action):
|
|
||||||
|
|
||||||
if self.error == ERROR['Empty'] and self.user_field.getText():
|
|
||||||
self._disable_error()
|
|
||||||
|
|
||||||
if action in (ACTION_BACK, ACTION_PARENT_DIR, ACTION_PREVIOUS_MENU):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def _add_editcontrol(self, x, y, height, width, password=0):
|
|
||||||
|
|
||||||
media = os.path.join(addon.getAddonInfo('path'), 'resources', 'skins', 'default', 'media')
|
|
||||||
control = xbmcgui.ControlEdit(0, 0, 0, 0,
|
|
||||||
label="User",
|
|
||||||
font="font10",
|
|
||||||
textColor="ff525252",
|
|
||||||
focusTexture=os.path.join(media, "button-focus.png"),
|
|
||||||
noFocusTexture=os.path.join(media, "button-focus.png"),
|
|
||||||
isPassword=password)
|
|
||||||
control.setPosition(x, y)
|
|
||||||
control.setHeight(height)
|
|
||||||
control.setWidth(width)
|
|
||||||
|
|
||||||
self.addControl(control)
|
|
||||||
return control
|
|
||||||
|
|
||||||
def _login(self, username, password):
|
|
||||||
|
|
||||||
result = self.emby.loginUser(self.server, username, password)
|
|
||||||
if not result:
|
|
||||||
self._error(ERROR['Invalid'], lang(33009))
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
self._user = result
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _error(self, state, message):
|
|
||||||
|
|
||||||
self.error = state
|
|
||||||
self.error_msg.setLabel(message)
|
|
||||||
self.error_toggle.setVisibleCondition('True')
|
|
||||||
|
|
||||||
def _disable_error(self):
|
|
||||||
|
|
||||||
self.error = None
|
|
||||||
self.error_toggle.setVisibleCondition('False')
|
|
|
@ -1,145 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
import xbmc
|
|
||||||
import xbmcgui
|
|
||||||
|
|
||||||
import connect.connectionmanager as connectionmanager
|
|
||||||
from utils import language as lang
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
log = logging.getLogger("EMBY."+__name__)
|
|
||||||
|
|
||||||
CONN_STATE = connectionmanager.ConnectionState
|
|
||||||
ACTION_PARENT_DIR = 9
|
|
||||||
ACTION_PREVIOUS_MENU = 10
|
|
||||||
ACTION_BACK = 92
|
|
||||||
ACTION_SELECT_ITEM = 7
|
|
||||||
ACTION_MOUSE_LEFT_CLICK = 100
|
|
||||||
USER_IMAGE = 150
|
|
||||||
USER_NAME = 151
|
|
||||||
LIST = 155
|
|
||||||
CANCEL = 201
|
|
||||||
MESSAGE_BOX = 202
|
|
||||||
MESSAGE = 203
|
|
||||||
BUSY = 204
|
|
||||||
EMBY_CONNECT = 205
|
|
||||||
MANUAL_SERVER = 206
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
class ServerConnect(xbmcgui.WindowXMLDialog):
|
|
||||||
|
|
||||||
username = ""
|
|
||||||
user_image = None
|
|
||||||
servers = []
|
|
||||||
|
|
||||||
_selected_server = None
|
|
||||||
_connect_login = False
|
|
||||||
_manual_server = False
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
|
|
||||||
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
|
|
||||||
|
|
||||||
def set_args(self, **kwargs):
|
|
||||||
# connect_manager, username, user_image, servers, emby_connect
|
|
||||||
for key, value in kwargs.iteritems():
|
|
||||||
setattr(self, key, value)
|
|
||||||
|
|
||||||
def is_server_selected(self):
|
|
||||||
return True if self._selected_server else False
|
|
||||||
|
|
||||||
def get_server(self):
|
|
||||||
return self._selected_server
|
|
||||||
|
|
||||||
def is_connect_login(self):
|
|
||||||
return self._connect_login
|
|
||||||
|
|
||||||
def is_manual_server(self):
|
|
||||||
return self._manual_server
|
|
||||||
|
|
||||||
|
|
||||||
def onInit(self):
|
|
||||||
|
|
||||||
self.message = self.getControl(MESSAGE)
|
|
||||||
self.message_box = self.getControl(MESSAGE_BOX)
|
|
||||||
self.busy = self.getControl(BUSY)
|
|
||||||
self.list_ = self.getControl(LIST)
|
|
||||||
|
|
||||||
for server in self.servers:
|
|
||||||
server_type = "wifi" if server.get('ExchangeToken') else "network"
|
|
||||||
self.list_.addItem(self._add_listitem(server['Name'], server['Id'], server_type))
|
|
||||||
|
|
||||||
self.getControl(USER_NAME).setLabel("%s %s" % (lang(33000), self.username.decode('utf-8')))
|
|
||||||
|
|
||||||
if self.user_image is not None:
|
|
||||||
self.getControl(USER_IMAGE).setImage(self.user_image)
|
|
||||||
|
|
||||||
if not self.emby_connect: # Change connect user
|
|
||||||
self.getControl(EMBY_CONNECT).setLabel("[UPPERCASE][B]"+lang(30618)+"[/B][/UPPERCASE]")
|
|
||||||
|
|
||||||
if self.servers:
|
|
||||||
self.setFocus(self.list_)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _add_listitem(cls, label, server_id, server_type):
|
|
||||||
|
|
||||||
item = xbmcgui.ListItem(label)
|
|
||||||
item.setProperty('id', server_id)
|
|
||||||
item.setProperty('server_type', server_type)
|
|
||||||
|
|
||||||
return item
|
|
||||||
|
|
||||||
def onAction(self, action):
|
|
||||||
|
|
||||||
if action in (ACTION_BACK, ACTION_PREVIOUS_MENU, ACTION_PARENT_DIR):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
if action in (ACTION_SELECT_ITEM, ACTION_MOUSE_LEFT_CLICK):
|
|
||||||
|
|
||||||
if self.getFocusId() == LIST:
|
|
||||||
server = self.list_.getSelectedItem()
|
|
||||||
selected_id = server.getProperty('id')
|
|
||||||
log.info('Server Id selected: %s', selected_id)
|
|
||||||
|
|
||||||
if self._connect_server(selected_id):
|
|
||||||
self.message_box.setVisibleCondition('False')
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def onClick(self, control):
|
|
||||||
|
|
||||||
if control == EMBY_CONNECT:
|
|
||||||
self.connect_manager.clearData()
|
|
||||||
self._connect_login = True
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
elif control == MANUAL_SERVER:
|
|
||||||
self._manual_server = True
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
elif control == CANCEL:
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def _connect_server(self, server_id):
|
|
||||||
|
|
||||||
server = self.connect_manager.getServerInfo(server_id)
|
|
||||||
self.message.setLabel("%s %s..." % (lang(30610), server['Name']))
|
|
||||||
self.message_box.setVisibleCondition('True')
|
|
||||||
self.busy.setVisibleCondition('True')
|
|
||||||
result = self.connect_manager.connectToServer(server)
|
|
||||||
|
|
||||||
if result['State'] == CONN_STATE['Unavailable']:
|
|
||||||
self.busy.setVisibleCondition('False')
|
|
||||||
self.message.setLabel(lang(30609))
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
xbmc.sleep(1000)
|
|
||||||
self._selected_server = result['Servers'][0]
|
|
||||||
return True
|
|
|
@ -1,145 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
|
|
||||||
import xbmcgui
|
|
||||||
import xbmcaddon
|
|
||||||
|
|
||||||
import connect.connectionmanager as connectionmanager
|
|
||||||
from utils import language as lang
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
log = logging.getLogger("EMBY."+__name__)
|
|
||||||
addon = xbmcaddon.Addon('plugin.video.emby')
|
|
||||||
|
|
||||||
CONN_STATE = connectionmanager.ConnectionState
|
|
||||||
ACTION_PARENT_DIR = 9
|
|
||||||
ACTION_PREVIOUS_MENU = 10
|
|
||||||
ACTION_BACK = 92
|
|
||||||
CONNECT = 200
|
|
||||||
CANCEL = 201
|
|
||||||
ERROR_TOGGLE = 202
|
|
||||||
ERROR_MSG = 203
|
|
||||||
ERROR = {
|
|
||||||
'Invalid': 1,
|
|
||||||
'Empty': 2
|
|
||||||
}
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
class ServerManual(xbmcgui.WindowXMLDialog):
|
|
||||||
|
|
||||||
_server = None
|
|
||||||
error = None
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
|
|
||||||
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
|
|
||||||
|
|
||||||
def set_connect_manager(self, connect_manager):
|
|
||||||
self.connect_manager = connect_manager
|
|
||||||
|
|
||||||
def is_connected(self):
|
|
||||||
return True if self._server else False
|
|
||||||
|
|
||||||
def get_server(self):
|
|
||||||
return self._server
|
|
||||||
|
|
||||||
def onInit(self):
|
|
||||||
|
|
||||||
self.connect_button = self.getControl(CONNECT)
|
|
||||||
self.cancel_button = self.getControl(CANCEL)
|
|
||||||
self.error_toggle = self.getControl(ERROR_TOGGLE)
|
|
||||||
self.error_msg = self.getControl(ERROR_MSG)
|
|
||||||
self.host_field = self._add_editcontrol(725, 400, 40, 500)
|
|
||||||
self.port_field = self._add_editcontrol(725, 525, 40, 500)
|
|
||||||
|
|
||||||
self.port_field.setText('8096')
|
|
||||||
self.setFocus(self.host_field)
|
|
||||||
|
|
||||||
self.host_field.controlUp(self.cancel_button)
|
|
||||||
self.host_field.controlDown(self.port_field)
|
|
||||||
self.port_field.controlUp(self.host_field)
|
|
||||||
self.port_field.controlDown(self.connect_button)
|
|
||||||
self.connect_button.controlUp(self.port_field)
|
|
||||||
self.cancel_button.controlDown(self.host_field)
|
|
||||||
|
|
||||||
def onClick(self, control):
|
|
||||||
|
|
||||||
if control == CONNECT:
|
|
||||||
# Sign in to emby connect
|
|
||||||
self._disable_error()
|
|
||||||
|
|
||||||
server = self.host_field.getText()
|
|
||||||
port = self.port_field.getText()
|
|
||||||
|
|
||||||
if not server or not port:
|
|
||||||
# Display error
|
|
||||||
self._error(ERROR['Empty'], lang(30617))
|
|
||||||
log.error("Server or port cannot be null")
|
|
||||||
|
|
||||||
elif self._connect_to_server(server, port):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
elif control == CANCEL:
|
|
||||||
# Remind me later
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def onAction(self, action):
|
|
||||||
|
|
||||||
if self.error == ERROR['Empty'] and self.host_field.getText() and self.port_field.getText():
|
|
||||||
self._disable_error()
|
|
||||||
|
|
||||||
if action in (ACTION_BACK, ACTION_PARENT_DIR, ACTION_PREVIOUS_MENU):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def _add_editcontrol(self, x, y, height, width):
|
|
||||||
|
|
||||||
media = os.path.join(addon.getAddonInfo('path'), 'resources', 'skins', 'default', 'media')
|
|
||||||
control = xbmcgui.ControlEdit(0, 0, 0, 0,
|
|
||||||
label="User",
|
|
||||||
font="font10",
|
|
||||||
textColor="ffc2c2c2",
|
|
||||||
focusTexture=os.path.join(media, "button-focus.png"),
|
|
||||||
noFocusTexture=os.path.join(media, "button-focus.png"))
|
|
||||||
control.setPosition(x, y)
|
|
||||||
control.setHeight(height)
|
|
||||||
control.setWidth(width)
|
|
||||||
|
|
||||||
self.addControl(control)
|
|
||||||
return control
|
|
||||||
|
|
||||||
def _connect_to_server(self, server, port):
|
|
||||||
|
|
||||||
server_address = "%s:%s" % (server, port)
|
|
||||||
self._message("%s %s..." % (lang(30610), server_address))
|
|
||||||
result = self.connect_manager.connectToAddress(server_address)
|
|
||||||
|
|
||||||
if result['State'] == CONN_STATE['Unavailable']:
|
|
||||||
self._message(lang(30609))
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
self._server = result['Servers'][0]
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _message(self, message):
|
|
||||||
|
|
||||||
self.error_msg.setLabel(message)
|
|
||||||
self.error_toggle.setVisibleCondition('True')
|
|
||||||
|
|
||||||
def _error(self, state, message):
|
|
||||||
|
|
||||||
self.error = state
|
|
||||||
self.error_msg.setLabel(message)
|
|
||||||
self.error_toggle.setVisibleCondition('True')
|
|
||||||
|
|
||||||
def _disable_error(self):
|
|
||||||
|
|
||||||
self.error = None
|
|
||||||
self.error_toggle.setVisibleCondition('False')
|
|
|
@ -1,104 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
import xbmc
|
|
||||||
import xbmcgui
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
log = logging.getLogger("EMBY."+__name__)
|
|
||||||
|
|
||||||
ACTION_PARENT_DIR = 9
|
|
||||||
ACTION_PREVIOUS_MENU = 10
|
|
||||||
ACTION_BACK = 92
|
|
||||||
ACTION_SELECT_ITEM = 7
|
|
||||||
ACTION_MOUSE_LEFT_CLICK = 100
|
|
||||||
LIST = 155
|
|
||||||
MANUAL = 200
|
|
||||||
CANCEL = 201
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
class UsersConnect(xbmcgui.WindowXMLDialog):
|
|
||||||
|
|
||||||
_user = None
|
|
||||||
_manual_login = False
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
|
|
||||||
self.kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2])
|
|
||||||
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
|
|
||||||
|
|
||||||
def set_server(self, server):
|
|
||||||
self.server = server
|
|
||||||
|
|
||||||
def set_users(self, users):
|
|
||||||
self.users = users
|
|
||||||
|
|
||||||
def is_user_selected(self):
|
|
||||||
return True if self._user else False
|
|
||||||
|
|
||||||
def get_user(self):
|
|
||||||
return self._user
|
|
||||||
|
|
||||||
def is_manual_login(self):
|
|
||||||
return self._manual_login
|
|
||||||
|
|
||||||
|
|
||||||
def onInit(self):
|
|
||||||
|
|
||||||
self.list_ = self.getControl(LIST)
|
|
||||||
for user in self.users:
|
|
||||||
user_image = ("userflyoutdefault2.png" if 'PrimaryImageTag' not in user
|
|
||||||
else self._get_user_artwork(user['Id'], 'Primary'))
|
|
||||||
self.list_.addItem(self._add_listitem(user['Name'], user['Id'], user_image))
|
|
||||||
|
|
||||||
self.setFocus(self.list_)
|
|
||||||
|
|
||||||
def _add_listitem(self, label, user_id, user_image):
|
|
||||||
|
|
||||||
item = xbmcgui.ListItem(label)
|
|
||||||
item.setProperty('id', user_id)
|
|
||||||
if self.kodi_version > 15:
|
|
||||||
item.setArt({'Icon': user_image})
|
|
||||||
else:
|
|
||||||
item.setArt({'icon': user_image})
|
|
||||||
|
|
||||||
return item
|
|
||||||
|
|
||||||
def onAction(self, action):
|
|
||||||
|
|
||||||
if action in (ACTION_BACK, ACTION_PREVIOUS_MENU, ACTION_PARENT_DIR):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
if action in (ACTION_SELECT_ITEM, ACTION_MOUSE_LEFT_CLICK):
|
|
||||||
|
|
||||||
if self.getFocusId() == LIST:
|
|
||||||
user = self.list_.getSelectedItem()
|
|
||||||
selected_id = user.getProperty('id')
|
|
||||||
log.info('User Id selected: %s', selected_id)
|
|
||||||
|
|
||||||
for user in self.users:
|
|
||||||
if user['Id'] == selected_id:
|
|
||||||
self._user = user
|
|
||||||
break
|
|
||||||
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def onClick(self, control):
|
|
||||||
|
|
||||||
if control == MANUAL:
|
|
||||||
self._manual_login = True
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
elif control == CANCEL:
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def _get_user_artwork(self, user_id, item_type):
|
|
||||||
# Load user information set by UserClient
|
|
||||||
return "%s/emby/Users/%s/Images/%s?Format=original" % (self.server, user_id, item_type)
|
|
|
@ -528,6 +528,8 @@ class InitialSetup(object):
|
||||||
|
|
||||||
# Do we need to migrate stuff?
|
# Do we need to migrate stuff?
|
||||||
check_migration()
|
check_migration()
|
||||||
|
# Reload the server IP cause we might've deleted it during migration
|
||||||
|
self.server = UserClient().get_server()
|
||||||
|
|
||||||
# Display a warning if Kodi puts ALL movies into the queue, basically
|
# Display a warning if Kodi puts ALL movies into the queue, basically
|
||||||
# breaking playback reporting for PKC
|
# breaking playback reporting for PKC
|
||||||
|
|
|
@ -49,6 +49,8 @@ class ThreadedProcessFanart(Thread):
|
||||||
stopped = self.stopped
|
stopped = self.stopped
|
||||||
suspended = self.suspended
|
suspended = self.suspended
|
||||||
queue = self.queue
|
queue = self.queue
|
||||||
|
counter = 0
|
||||||
|
set_zero = False
|
||||||
while not stopped():
|
while not stopped():
|
||||||
# In the event the server goes offline
|
# In the event the server goes offline
|
||||||
while suspended():
|
while suspended():
|
||||||
|
@ -62,19 +64,15 @@ class ThreadedProcessFanart(Thread):
|
||||||
try:
|
try:
|
||||||
item = queue.get(block=False)
|
item = queue.get(block=False)
|
||||||
except Empty:
|
except Empty:
|
||||||
|
if not set_zero:
|
||||||
|
# Avoid saving '0' all the time
|
||||||
|
set_zero = True
|
||||||
|
settings('fanarttv_lookups', value='0')
|
||||||
sleep(200)
|
sleep(200)
|
||||||
continue
|
continue
|
||||||
|
set_zero = False
|
||||||
if isinstance(item, ArtworkSyncMessage):
|
if isinstance(item, ArtworkSyncMessage):
|
||||||
if item.artwork_counter is not None:
|
if state.IMAGE_SYNC_NOTIFICATIONS:
|
||||||
if item.artwork_counter == 0:
|
|
||||||
# Done caching, show this in the PKC settings, too
|
|
||||||
settings('fanarttv_lookups', value=lang(30069))
|
|
||||||
LOG.info('Done caching major images!')
|
|
||||||
else:
|
|
||||||
settings('fanarttv_lookups',
|
|
||||||
value=str(item.artwork_counter))
|
|
||||||
if item.message and state.IMAGE_SYNC_NOTIFICATIONS:
|
|
||||||
dialog('notification',
|
dialog('notification',
|
||||||
heading=lang(29999),
|
heading=lang(29999),
|
||||||
message=item.message,
|
message=item.message,
|
||||||
|
@ -92,5 +90,10 @@ class ThreadedProcessFanart(Thread):
|
||||||
LOG.debug('Done getting fanart for Plex id %s', item['plex_id'])
|
LOG.debug('Done getting fanart for Plex id %s', item['plex_id'])
|
||||||
with plexdb.Get_Plex_DB() as plex_db:
|
with plexdb.Get_Plex_DB() as plex_db:
|
||||||
plex_db.set_fanart_synched(item['plex_id'])
|
plex_db.set_fanart_synched(item['plex_id'])
|
||||||
|
# Update the caching state in the PKC settings. Avoid saving '0'
|
||||||
|
counter += 1
|
||||||
|
if counter > 10:
|
||||||
|
counter = 0
|
||||||
|
settings('fanarttv_lookups', value=str(queue.qsize()))
|
||||||
queue.task_done()
|
queue.task_done()
|
||||||
LOG.debug("---===### Stopped FanartSync ###===---")
|
LOG.debug("---===### Stopped FanartSync ###===---")
|
||||||
|
|
|
@ -263,16 +263,13 @@ class LibrarySync(Thread):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _full_sync(self):
|
def _full_sync(self):
|
||||||
process = {
|
process = [self.plex_movies, self.plex_tv_show]
|
||||||
'movies': self.plex_movies,
|
|
||||||
'tvshows': self.plex_tv_show,
|
|
||||||
}
|
|
||||||
if state.ENABLE_MUSIC:
|
if state.ENABLE_MUSIC:
|
||||||
process['music'] = self.plex_music
|
process.append(self.plex_music)
|
||||||
|
|
||||||
# Do the processing
|
# Do the processing
|
||||||
for itemtype in process:
|
for kind in process:
|
||||||
if self.suspend_item_sync() or not process[itemtype]():
|
if self.suspend_item_sync() or not kind():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Let kodi update the views in any case, since we're doing a full sync
|
# Let kodi update the views in any case, since we're doing a full sync
|
||||||
|
@ -1393,21 +1390,15 @@ class LibrarySync(Thread):
|
||||||
# Shuffle the list to not always start out identically
|
# Shuffle the list to not always start out identically
|
||||||
shuffle(items)
|
shuffle(items)
|
||||||
# Checking FanartTV for %s items
|
# Checking FanartTV for %s items
|
||||||
self.fanartqueue.put(artwork.ArtworkSyncMessage(
|
self.fanartqueue.put(artwork.ArtworkSyncMessage(lang(30018) % len(items)))
|
||||||
message=lang(30018) % len(items), artwork_counter=len(items)))
|
|
||||||
for i, item in enumerate(items):
|
for i, item in enumerate(items):
|
||||||
self.fanartqueue.put({
|
self.fanartqueue.put({
|
||||||
'plex_id': item['plex_id'],
|
'plex_id': item['plex_id'],
|
||||||
'plex_type': item['plex_type'],
|
'plex_type': item['plex_type'],
|
||||||
'refresh': refresh
|
'refresh': refresh
|
||||||
})
|
})
|
||||||
if (len(items) - i) % 10 == 0:
|
|
||||||
# Update the PKC settings for fanart.tv lookup
|
|
||||||
msg = artwork.ArtworkSyncMessage(artwork_counter=len(items) - i)
|
|
||||||
self.fanartqueue.put(msg)
|
|
||||||
# FanartTV lookup completed
|
# FanartTV lookup completed
|
||||||
self.fanartqueue.put(artwork.ArtworkSyncMessage(message=lang(30019),
|
self.fanartqueue.put(artwork.ArtworkSyncMessage(lang(30019)))
|
||||||
artwork_counter=0))
|
|
||||||
|
|
||||||
def triage_lib_scans(self):
|
def triage_lib_scans(self):
|
||||||
"""
|
"""
|
||||||
|
@ -1582,7 +1573,7 @@ class LibrarySync(Thread):
|
||||||
heading='{plex}',
|
heading='{plex}',
|
||||||
line1=lang(29999) + lang(39402))
|
line1=lang(29999) + lang(39402))
|
||||||
else:
|
else:
|
||||||
utils.reset()
|
utils.reset(ask_user=False)
|
||||||
break
|
break
|
||||||
kodi_db_version_checked = True
|
kodi_db_version_checked = True
|
||||||
|
|
||||||
|
|
|
@ -11,14 +11,19 @@ def check_migration():
|
||||||
last_migration = settings('last_migrated_PKC_version')
|
last_migration = settings('last_migrated_PKC_version')
|
||||||
if last_migration == v.ADDON_VERSION:
|
if last_migration == v.ADDON_VERSION:
|
||||||
log.info('Already migrated to PKC version %s' % v.ADDON_VERSION)
|
log.info('Already migrated to PKC version %s' % v.ADDON_VERSION)
|
||||||
|
# Ensure later migration if user downgraded PKC!
|
||||||
|
settings('last_migrated_PKC_version', value=v.ADDON_VERSION)
|
||||||
return
|
return
|
||||||
if not last_migration:
|
|
||||||
log.info('Never migrated, so checking everything')
|
|
||||||
last_migration = '1.0.0'
|
|
||||||
|
|
||||||
if not compare_version(v.ADDON_VERSION, '1.8.2'):
|
if not compare_version(v.ADDON_VERSION, '1.8.2'):
|
||||||
log.info('Migrating to version 1.8.1')
|
log.info('Migrating to version 1.8.1')
|
||||||
# Set the new PKC theMovieDB key
|
# Set the new PKC theMovieDB key
|
||||||
settings('themoviedbAPIKey', value='19c90103adb9e98f2172c6a6a3d85dc4')
|
settings('themoviedbAPIKey', value='19c90103adb9e98f2172c6a6a3d85dc4')
|
||||||
|
|
||||||
|
if not compare_version(v.ADDON_VERSION, '2.0.25'):
|
||||||
|
log.info('Migrating to version 2.0.24')
|
||||||
|
# Need to re-connect with PMS to pick up on plex.direct URIs
|
||||||
|
settings('ipaddress', value='')
|
||||||
|
settings('port', value='')
|
||||||
|
|
||||||
settings('last_migrated_PKC_version', value=v.ADDON_VERSION)
|
settings('last_migrated_PKC_version', value=v.ADDON_VERSION)
|
||||||
|
|
|
@ -206,6 +206,7 @@ def _init_existing_kodi_playlist(playqueue, pos):
|
||||||
LOG.debug('Kodi playlist size: %s', playqueue.kodi_pl.size())
|
LOG.debug('Kodi playlist size: %s', playqueue.kodi_pl.size())
|
||||||
kodi_items = js.playlist_get_items(playqueue.playlistid)
|
kodi_items = js.playlist_get_items(playqueue.playlistid)
|
||||||
if not kodi_items:
|
if not kodi_items:
|
||||||
|
LOG.error('No Kodi items returned')
|
||||||
raise PL.PlaylistError('No Kodi items returned')
|
raise PL.PlaylistError('No Kodi items returned')
|
||||||
item = PL.init_Plex_playlist(playqueue, kodi_item=kodi_items[pos])
|
item = PL.init_Plex_playlist(playqueue, kodi_item=kodi_items[pos])
|
||||||
item.force_transcode = state.FORCE_TRANSCODE
|
item.force_transcode = state.FORCE_TRANSCODE
|
||||||
|
|
|
@ -436,19 +436,19 @@ def wipe_database():
|
||||||
connection.commit()
|
connection.commit()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
# Reset the artwork sync status in the PKC settings
|
# Reset the artwork sync status in the PKC settings
|
||||||
settings('caching_major_artwork', value=language(39310))
|
settings('caching_artwork_count', value=language(39310))
|
||||||
settings('fanarttv_lookups', value=language(39310))
|
settings('fanarttv_lookups', value=language(39310))
|
||||||
# reset the install run flag
|
# reset the install run flag
|
||||||
settings('SyncInstallRunDone', value="false")
|
settings('SyncInstallRunDone', value="false")
|
||||||
|
|
||||||
|
|
||||||
def reset():
|
def reset(ask_user=True):
|
||||||
"""
|
"""
|
||||||
User navigated to the PKC settings, Advanced, and wants to reset the Kodi
|
User navigated to the PKC settings, Advanced, and wants to reset the Kodi
|
||||||
database and possibly PKC entirely
|
database and possibly PKC entirely
|
||||||
"""
|
"""
|
||||||
# Are you sure you want to reset your local Kodi database?
|
# Are you sure you want to reset your local Kodi database?
|
||||||
if not dialog('yesno',
|
if ask_user and not dialog('yesno',
|
||||||
heading='{plex} %s ' % language(30132),
|
heading='{plex} %s ' % language(30132),
|
||||||
line1=language(39600)):
|
line1=language(39600)):
|
||||||
return
|
return
|
||||||
|
@ -472,7 +472,7 @@ def reset():
|
||||||
|
|
||||||
# Reset all PlexKodiConnect Addon settings? (this is usually NOT
|
# Reset all PlexKodiConnect Addon settings? (this is usually NOT
|
||||||
# recommended and unnecessary!)
|
# recommended and unnecessary!)
|
||||||
if dialog('yesno',
|
if ask_user and dialog('yesno',
|
||||||
heading='{plex} %s ' % language(30132),
|
heading='{plex} %s ' % language(30132),
|
||||||
line1=language(39603)):
|
line1=language(39603)):
|
||||||
# Delete the settings
|
# Delete the settings
|
||||||
|
|
|
@ -76,7 +76,7 @@ COMPANION_PORT = int(_ADDON.getSetting('companionPort'))
|
||||||
PKC_MACHINE_IDENTIFIER = None
|
PKC_MACHINE_IDENTIFIER = None
|
||||||
|
|
||||||
# Minimal PKC version needed for the Kodi database - otherwise need to recreate
|
# Minimal PKC version needed for the Kodi database - otherwise need to recreate
|
||||||
MIN_DB_VERSION = '2.0.11'
|
MIN_DB_VERSION = '2.0.24'
|
||||||
|
|
||||||
# Database paths
|
# Database paths
|
||||||
_DB_VIDEO_VERSION = {
|
_DB_VIDEO_VERSION = {
|
||||||
|
|
|
@ -126,12 +126,12 @@
|
||||||
<setting id="enableTextureCache" label="30512" type="bool" default="true" /> <!-- Cache all artwork for a smooth Kodi experience -->
|
<setting id="enableTextureCache" label="30512" type="bool" default="true" /> <!-- Cache all artwork for a smooth Kodi experience -->
|
||||||
<setting id="FanartTV" label="30539" type="bool" default="false" /><!-- Download additional art from FanArtTV -->
|
<setting id="FanartTV" label="30539" type="bool" default="false" /><!-- Download additional art from FanArtTV -->
|
||||||
<setting label="39222" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=fanart)" option="close" visible="eq(-1,true)" subsetting="true" /> <!-- Look for missing fanart on FanartTV now -->
|
<setting label="39222" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=fanart)" option="close" visible="eq(-1,true)" subsetting="true" /> <!-- Look for missing fanart on FanartTV now -->
|
||||||
<setting id="imageSyncNotifications" label="30008" type="bool" default="true" /><!-- Enable notifications for image caching -->
|
<setting id="imageSyncNotifications" label="30008" type="bool" default="false" /><!-- Enable notifications for image caching -->
|
||||||
<setting id="imageSyncDuringPlayback" label="30009" type="bool" default="true" /><!-- Enable image caching during Kodi playback (restart Kodi!) -->
|
<setting id="imageSyncDuringPlayback" label="30009" type="bool" default="true" /><!-- Enable image caching during Kodi playback (restart Kodi!) -->
|
||||||
<setting label="39020" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=texturecache)" option="close" /> <!-- Cache all images to Kodi texture cache now -->
|
<setting label="39020" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=texturecache)" option="close" /> <!-- Cache all images to Kodi texture cache now -->
|
||||||
<setting type="sep" />
|
<setting type="sep" />
|
||||||
<setting type="lsep" label="30010" /><!-- Approximate progress -->
|
<setting type="lsep" label="30010" /><!-- Approximate progress -->
|
||||||
<setting id="caching_major_artwork" label="30011" type="text" default="$ADDON[plugin.video.plexkodiconnect 39310]" enable="false" visible="eq(-8,true)"/><!-- Plex artwork (posters and backgrounds) left to cache: -->
|
<setting id="caching_artwork_count" label="30011" type="text" default="$ADDON[plugin.video.plexkodiconnect 39310]" enable="false" visible="eq(-8,true)"/><!-- Plex artwork (posters and backgrounds) left to cache: -->
|
||||||
<setting id="fanarttv_lookups" label="30015" type="text" default="$ADDON[plugin.video.plexkodiconnect 39310]" enable="false" visible="eq(-8,true)"/><!-- Movie and show FanartTV lookups left to do: -->
|
<setting id="fanarttv_lookups" label="30015" type="text" default="$ADDON[plugin.video.plexkodiconnect 39310]" enable="false" visible="eq(-8,true)"/><!-- Movie and show FanartTV lookups left to do: -->
|
||||||
</category>
|
</category>
|
||||||
<!--
|
<!--
|
||||||
|
|
|
@ -1,145 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<window>
|
|
||||||
<defaultcontrol always="true">200</defaultcontrol>
|
|
||||||
<zorder>0</zorder>
|
|
||||||
<include>dialogeffect</include>
|
|
||||||
<controls>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background fade</description>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>100%</height>
|
|
||||||
<texture>emby-bg-fade.png</texture>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>600</width>
|
|
||||||
<left>35%</left>
|
|
||||||
<top>20%</top>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background box</description>
|
|
||||||
<texture colordiffuse="ff111111">white.png</texture>
|
|
||||||
<width>600</width>
|
|
||||||
<height>480</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group" id="202">
|
|
||||||
<top>485</top>
|
|
||||||
<visible>False</visible>
|
|
||||||
<control type="image">
|
|
||||||
<description>Error box</description>
|
|
||||||
<texture colordiffuse="ff222222">white.png</texture>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label" id="203">
|
|
||||||
<description>Error message</description>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<height>50</height>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>Emby logo</description>
|
|
||||||
<texture>logo-white.png</texture>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<width>120</width>
|
|
||||||
<height>49</height>
|
|
||||||
<top>30</top>
|
|
||||||
<left>25</left>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>500</width>
|
|
||||||
<left>50</left>
|
|
||||||
<control type="label">
|
|
||||||
<description>Please sign in</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30612]</label>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font12</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<top>100</top>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<top>150</top>
|
|
||||||
<control type="label">
|
|
||||||
<description>Username</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30024]</label>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>separator</description>
|
|
||||||
<width>102%</width>
|
|
||||||
<height>0.5</height>
|
|
||||||
<top>66</top>
|
|
||||||
<left>-10</left>
|
|
||||||
<texture colordiffuse="ff525252" border="90,3,90,3">emby-separator.png</texture>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<description>Password</description>
|
|
||||||
<top>225</top>
|
|
||||||
<control type="label">
|
|
||||||
<description>Password label</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30602]</label>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>separator</description>
|
|
||||||
<width>102%</width>
|
|
||||||
<height>0.5</height>
|
|
||||||
<top>66</top>
|
|
||||||
<left>-10</left>
|
|
||||||
<texture colordiffuse="ff525252" border="90,3,90,3">emby-separator.png</texture>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<description>Buttons</description>
|
|
||||||
<top>335</top>
|
|
||||||
<control type="button" id="200">
|
|
||||||
<description>Sign in</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff0b8628">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff13a134">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30605][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<ondown>201</ondown>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="button" id="201">
|
|
||||||
<description>Cancel</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>55</top>
|
|
||||||
<onup>200</onup>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</controls>
|
|
||||||
</window>
|
|
|
@ -1,179 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<window>
|
|
||||||
<defaultcontrol always="true">200</defaultcontrol>
|
|
||||||
<zorder>0</zorder>
|
|
||||||
<include>dialogeffect</include>
|
|
||||||
<controls>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background fade</description>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>100%</height>
|
|
||||||
<texture>emby-bg-fade.png</texture>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>600</width>
|
|
||||||
<left>35%</left>
|
|
||||||
<top>15%</top>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background box</description>
|
|
||||||
<texture colordiffuse="ff111111">white.png</texture>
|
|
||||||
<width>600</width>
|
|
||||||
<height>700</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group" id="202">
|
|
||||||
<top>705</top>
|
|
||||||
<visible>False</visible>
|
|
||||||
<control type="image">
|
|
||||||
<description>Error box</description>
|
|
||||||
<texture colordiffuse="ff222222">white.png</texture>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label" id="203">
|
|
||||||
<description>Error message</description>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<height>50</height>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>Emby logo</description>
|
|
||||||
<texture>logo-white.png</texture>
|
|
||||||
<width>160</width>
|
|
||||||
<height>49</height>
|
|
||||||
<top>30</top>
|
|
||||||
<left>25</left>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>500</width>
|
|
||||||
<left>50</left>
|
|
||||||
<control type="label">
|
|
||||||
<description>Sign in emby connect</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30600]</label>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font12</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<top>115</top>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<top>190</top>
|
|
||||||
<control type="label">
|
|
||||||
<description>Username email</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30543]</label>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>separator</description>
|
|
||||||
<width>102%</width>
|
|
||||||
<height>0.5</height>
|
|
||||||
<top>66</top>
|
|
||||||
<left>-10</left>
|
|
||||||
<texture colordiffuse="ff525252" border="90,3,90,3">emby-separator.png</texture>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<description>Password</description>
|
|
||||||
<top>275</top>
|
|
||||||
<control type="label">
|
|
||||||
<description>Password label</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30602]</label>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>separator</description>
|
|
||||||
<width>102%</width>
|
|
||||||
<height>0.5</height>
|
|
||||||
<top>66</top>
|
|
||||||
<left>-10</left>
|
|
||||||
<texture colordiffuse="ff525252" border="90,3,90,3">emby-separator.png</texture>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<description>Buttons</description>
|
|
||||||
<top>385</top>
|
|
||||||
<control type="button" id="200">
|
|
||||||
<description>Sign in</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff0b8628">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff13a134">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30605][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<ondown>201</ondown>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="button" id="201">
|
|
||||||
<description>Cancel</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>55</top>
|
|
||||||
<onup>200</onup>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<description>Disclaimer</description>
|
|
||||||
<top>510</top>
|
|
||||||
<control type="label">
|
|
||||||
<description>Disclaimer label</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30603]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ff464646</textcolor>
|
|
||||||
<wrapmultiline>true</wrapmultiline>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<width>340</width>
|
|
||||||
<height>100%</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<control type="label">
|
|
||||||
<description>Scan me</description>
|
|
||||||
<label>[UPPERCASE]$ADDON[plugin.video.emby 30604][/UPPERCASE]</label>
|
|
||||||
<font>font12</font>
|
|
||||||
<textcolor>ff0b8628</textcolor>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<width>200</width>
|
|
||||||
<top>120</top>
|
|
||||||
<left>230</left>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>qrcode</description>
|
|
||||||
<texture>qrcode_disclaimer.png</texture>
|
|
||||||
<width>140</width>
|
|
||||||
<height>140</height>
|
|
||||||
<top>10</top>
|
|
||||||
<left>360</left>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</controls>
|
|
||||||
</window>
|
|
|
@ -1,154 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<window>
|
|
||||||
<defaultcontrol always="true">200</defaultcontrol>
|
|
||||||
<zorder>0</zorder>
|
|
||||||
<include>dialogeffect</include>
|
|
||||||
<controls>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background fade</description>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>100%</height>
|
|
||||||
<texture>emby-bg-fade.png</texture>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>600</width>
|
|
||||||
<left>35%</left>
|
|
||||||
<top>20%</top>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background box</description>
|
|
||||||
<texture colordiffuse="ff111111">white.png</texture>
|
|
||||||
<width>600</width>
|
|
||||||
<height>525</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group" id="202">
|
|
||||||
<top>530</top>
|
|
||||||
<visible>False</visible>
|
|
||||||
<control type="image">
|
|
||||||
<description>Error box</description>
|
|
||||||
<texture colordiffuse="ff222222">white.png</texture>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label" id="203">
|
|
||||||
<description>Error message</description>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<height>50</height>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>Emby logo</description>
|
|
||||||
<texture>logo-white.png</texture>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<width>120</width>
|
|
||||||
<height>49</height>
|
|
||||||
<top>30</top>
|
|
||||||
<left>25</left>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>500</width>
|
|
||||||
<left>50</left>
|
|
||||||
<control type="label">
|
|
||||||
<description>Connect to server</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30614]</label>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font12</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<top>100</top>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<top>150</top>
|
|
||||||
<control type="label">
|
|
||||||
<description>Host</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30615]</label>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>separator</description>
|
|
||||||
<width>102%</width>
|
|
||||||
<height>0.5</height>
|
|
||||||
<top>66</top>
|
|
||||||
<left>-10</left>
|
|
||||||
<texture colordiffuse="ff525252" border="90,3,90,3">emby-separator.png</texture>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label">
|
|
||||||
<description>Host example</description>
|
|
||||||
<label>192.168.1.100 or https://myserver.com</label>
|
|
||||||
<textcolor>ff464646</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<top>70</top>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<description>Port</description>
|
|
||||||
<top>275</top>
|
|
||||||
<control type="label">
|
|
||||||
<description>Port label</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30030]</label>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>separator</description>
|
|
||||||
<width>102%</width>
|
|
||||||
<height>0.5</height>
|
|
||||||
<top>66</top>
|
|
||||||
<left>-10</left>
|
|
||||||
<texture colordiffuse="ff525252" border="90,3,90,3">emby-separator.png</texture>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<description>Buttons</description>
|
|
||||||
<top>380</top>
|
|
||||||
<control type="button" id="200">
|
|
||||||
<description>Connect</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff0b8628">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff13a134">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30616][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<ondown>201</ondown>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="button" id="201">
|
|
||||||
<description>Cancel</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>55</top>
|
|
||||||
<onup>200</onup>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</controls>
|
|
||||||
</window>
|
|
|
@ -1,280 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<window>
|
|
||||||
<defaultcontrol always="true">205</defaultcontrol>
|
|
||||||
<zorder>0</zorder>
|
|
||||||
<include>dialogeffect</include>
|
|
||||||
<controls>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background fade</description>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>100%</height>
|
|
||||||
<texture>emby-bg-fade.png</texture>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>450</width>
|
|
||||||
<left>38%</left>
|
|
||||||
<top>15%</top>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background box</description>
|
|
||||||
<texture colordiffuse="ff111111">white.png</texture>
|
|
||||||
<width>450</width>
|
|
||||||
<height>710</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>Emby logo</description>
|
|
||||||
<texture>logo-white.png</texture>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<width>120</width>
|
|
||||||
<height>49</height>
|
|
||||||
<top>30</top>
|
|
||||||
<left>25</left>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<description>User info</description>
|
|
||||||
<top>70</top>
|
|
||||||
<width>350</width>
|
|
||||||
<left>50</left>
|
|
||||||
<control type="image" id="150">
|
|
||||||
<description>User image</description>
|
|
||||||
<texture diffuse="user_image.png">userflyoutdefault.png</texture>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>70</height>
|
|
||||||
<top>40</top>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image" id="204">
|
|
||||||
<description>Busy animation</description>
|
|
||||||
<align>center</align>
|
|
||||||
<top>23</top>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>105</height>
|
|
||||||
<visible>False</visible>
|
|
||||||
<texture colordiffuse="ff13a134">fading_circle.png</texture>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<animation effect="rotate" start="360" end="0" center="auto" time="2000" loop="true" condition="true">conditional</animation>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label" id="151">
|
|
||||||
<description>Welcome user</description>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font12</font>
|
|
||||||
<align>center</align>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<top>120</top>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>separator</description>
|
|
||||||
<width>102%</width>
|
|
||||||
<height>0.5</height>
|
|
||||||
<top>165</top>
|
|
||||||
<left>-10</left>
|
|
||||||
<texture colordiffuse="ff525252" border="90,3,90,3">emby-separator.png</texture>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label">
|
|
||||||
<description>Select server</description>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<label>$ADDON[plugin.video.emby 30607]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<align>center</align>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<top>170</top>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<top>290</top>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>184</height>
|
|
||||||
<control type="list" id="155">
|
|
||||||
<description>Connect servers</description>
|
|
||||||
<focusposition>0</focusposition>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>100%</height>
|
|
||||||
<top>10</top>
|
|
||||||
<left>55</left>
|
|
||||||
<onup>155</onup>
|
|
||||||
<ondown condition="Control.IsVisible(205)">205</ondown>
|
|
||||||
<ondown condition="!Control.IsVisible(205)">206</ondown>
|
|
||||||
<onleft condition="Control.IsVisible(205)">205</onleft>
|
|
||||||
<onleft condition="!Control.IsVisible(205)">206</onleft>
|
|
||||||
<onright>155</onright>
|
|
||||||
<pagecontrol>60</pagecontrol>
|
|
||||||
<scrolltime tween="sine" easing="out">250</scrolltime>
|
|
||||||
<itemlayout height="46">
|
|
||||||
<control type="group">
|
|
||||||
<width>45</width>
|
|
||||||
<height>45</height>
|
|
||||||
<control type="image">
|
|
||||||
<description>Network</description>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<texture>network.png</texture>
|
|
||||||
<visible>StringCompare(ListItem.Property(server_type),network)</visible>
|
|
||||||
</control>
|
|
||||||
<control type="image">
|
|
||||||
<description>Wifi</description>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<texture>wifi.png</texture>
|
|
||||||
<visible>StringCompare(ListItem.Property(server_type),wifi)</visible>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label">
|
|
||||||
<width>300</width>
|
|
||||||
<height>40</height>
|
|
||||||
<left>55</left>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<textcolor>ff838383</textcolor>
|
|
||||||
<info>ListItem.Label</info>
|
|
||||||
</control>
|
|
||||||
</itemlayout>
|
|
||||||
<focusedlayout height="46">
|
|
||||||
<control type="group">
|
|
||||||
<width>45</width>
|
|
||||||
<height>45</height>
|
|
||||||
<control type="image">
|
|
||||||
<description>Network</description>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<texture>network.png</texture>
|
|
||||||
<visible>StringCompare(ListItem.Property(server_type),network)</visible>
|
|
||||||
</control>
|
|
||||||
<control type="image">
|
|
||||||
<description>Wifi</description>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<texture>wifi.png</texture>
|
|
||||||
<visible>StringCompare(ListItem.Property(server_type),wifi)</visible>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label">
|
|
||||||
<width>300</width>
|
|
||||||
<height>40</height>
|
|
||||||
<left>55</left>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<info>ListItem.Label</info>
|
|
||||||
<visible>Control.HasFocus(155)</visible>
|
|
||||||
</control>
|
|
||||||
<control type="label">
|
|
||||||
<width>300</width>
|
|
||||||
<height>40</height>
|
|
||||||
<left>55</left>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<textcolor>ff838383</textcolor>
|
|
||||||
<info>ListItem.Label</info>
|
|
||||||
<visible>!Control.HasFocus(155)</visible>
|
|
||||||
</control>
|
|
||||||
</focusedlayout>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="scrollbar" id="60">
|
|
||||||
<left>395</left>
|
|
||||||
<top>10</top>
|
|
||||||
<width>5</width>
|
|
||||||
<height>100%</height>
|
|
||||||
<onleft>155</onleft>
|
|
||||||
<onup>60</onup>
|
|
||||||
<ondown>60</ondown>
|
|
||||||
<texturesliderbackground colordiffuse="ff000000" border="4">box.png</texturesliderbackground>
|
|
||||||
<texturesliderbar colordiffuse="ff222222" border="4">box.png</texturesliderbar>
|
|
||||||
<texturesliderbarfocus colordiffuse="ff222222" border="4">box.png</texturesliderbarfocus>
|
|
||||||
<showonepage>false</showonepage>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<top>100%</top>
|
|
||||||
<height>220</height>
|
|
||||||
<control type="group">
|
|
||||||
<top>45</top>
|
|
||||||
<height>150</height>
|
|
||||||
<control type="button" id="205">
|
|
||||||
<visible>True</visible>
|
|
||||||
<description>Sign in Connect</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff0b8628">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff13a134">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30600][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<width>350</width>
|
|
||||||
<height>50</height>
|
|
||||||
<left>50</left>
|
|
||||||
<onup>155</onup>
|
|
||||||
<ondown>206</ondown>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="button" id="206">
|
|
||||||
<description>Manually add server</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30611][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<top>55</top>
|
|
||||||
<width>350</width>
|
|
||||||
<height>50</height>
|
|
||||||
<left>50</left>
|
|
||||||
<onup condition="Control.IsVisible(205)">205</onup>
|
|
||||||
<onup condition="!Control.IsVisible(205)">155</onup>
|
|
||||||
<ondown>201</ondown>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="button" id="201">
|
|
||||||
<description>Cancel</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<top>110</top>
|
|
||||||
<width>350</width>
|
|
||||||
<height>50</height>
|
|
||||||
<left>50</left>
|
|
||||||
<onup>206</onup>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group" id="202">
|
|
||||||
<top>100%</top>
|
|
||||||
<visible>False</visible>
|
|
||||||
<control type="image">
|
|
||||||
<description>Message box</description>
|
|
||||||
<texture colordiffuse="ff222222">white.png</texture>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>20</top>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label" id="203">
|
|
||||||
<description>Message</description>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font10</font>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<height>50</height>
|
|
||||||
<top>20</top>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</controls>
|
|
||||||
</window>
|
|
|
@ -1,198 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<window>
|
|
||||||
<defaultcontrol always="true">155</defaultcontrol>
|
|
||||||
<zorder>0</zorder>
|
|
||||||
<include>dialogeffect</include>
|
|
||||||
<controls>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background fade</description>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>100%</height>
|
|
||||||
<texture>emby-bg-fade.png</texture>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>715</width>
|
|
||||||
<left>32%</left>
|
|
||||||
<top>20%</top>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background box</description>
|
|
||||||
<texture border="6" colordiffuse="ff111111">white.png</texture>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>525</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>Emby logo</description>
|
|
||||||
<texture>logo-white.png</texture>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<width>120</width>
|
|
||||||
<height>49</height>
|
|
||||||
<top>30</top>
|
|
||||||
<left>25</left>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label">
|
|
||||||
<description>Please sign in</description>
|
|
||||||
<label>$ADDON[plugin.video.emby 30612]</label>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<font>font12</font>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<top>80</top>
|
|
||||||
<width>100%</width>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<top>100</top>
|
|
||||||
<width>620</width>
|
|
||||||
<height>245</height>
|
|
||||||
<left>50</left>
|
|
||||||
<control type="list" id="155">
|
|
||||||
<description>Select User</description>
|
|
||||||
<focusposition>0</focusposition>
|
|
||||||
<width>100%</width>
|
|
||||||
<top>40</top>
|
|
||||||
<onleft>155</onleft>
|
|
||||||
<onright>155</onright>
|
|
||||||
<ondown>200</ondown>
|
|
||||||
<pagecontrol>60</pagecontrol>
|
|
||||||
<orientation>horizontal</orientation>
|
|
||||||
<scrolltime tween="sine" easing="out">250</scrolltime>
|
|
||||||
<itemlayout width="155">
|
|
||||||
<control type="group">
|
|
||||||
<width>150</width>
|
|
||||||
<control type="image">
|
|
||||||
<description>User image</description>
|
|
||||||
<colordiffuse>ff888888</colordiffuse>
|
|
||||||
<info>ListItem.Icon</info>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>150</height>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>Background label</description>
|
|
||||||
<texture colordiffuse="ff222222">white.png</texture>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>150</top>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label">
|
|
||||||
<width>100%</width>
|
|
||||||
<align>center</align>
|
|
||||||
<height>50</height>
|
|
||||||
<top>150</top>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<info>ListItem.Label</info>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</itemlayout>
|
|
||||||
<focusedlayout width="155">
|
|
||||||
<control type="group">
|
|
||||||
<width>150</width>
|
|
||||||
<control type="image">
|
|
||||||
<description>User image</description>
|
|
||||||
<info>ListItem.Icon</info>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>150</height>
|
|
||||||
<visible>Control.HasFocus(155)</visible>
|
|
||||||
</control>
|
|
||||||
<control type="image">
|
|
||||||
<description>User image</description>
|
|
||||||
<colordiffuse>ff888888</colordiffuse>
|
|
||||||
<info>ListItem.Icon</info>
|
|
||||||
<aspectratio>keep</aspectratio>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>150</height>
|
|
||||||
<visible>!Control.HasFocus(155)</visible>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="image">
|
|
||||||
<description>Background label</description>
|
|
||||||
<texture colordiffuse="ff333333">white.png</texture>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>150</top>
|
|
||||||
<visible>Control.HasFocus(155)</visible>
|
|
||||||
</control>
|
|
||||||
<control type="image">
|
|
||||||
<description>Background label</description>
|
|
||||||
<texture colordiffuse="ff222222">white.png</texture>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>150</top>
|
|
||||||
<visible>!Control.HasFocus(155)</visible>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="label">
|
|
||||||
<width>100%</width>
|
|
||||||
<align>center</align>
|
|
||||||
<height>50</height>
|
|
||||||
<top>150</top>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>white</textcolor>
|
|
||||||
<info>ListItem.Label</info>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</focusedlayout>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="scrollbar" id="60">
|
|
||||||
<top>100%</top>
|
|
||||||
<width>615</width>
|
|
||||||
<height>5</height>
|
|
||||||
<onleft>155</onleft>
|
|
||||||
<onleft>60</onleft>
|
|
||||||
<onright>60</onright>
|
|
||||||
<texturesliderbackground colordiffuse="ff000000" border="4">box.png</texturesliderbackground>
|
|
||||||
<texturesliderbar colordiffuse="ff222222" border="4">box.png</texturesliderbar>
|
|
||||||
<texturesliderbarfocus colordiffuse="ff222222" border="4">box.png</texturesliderbarfocus>
|
|
||||||
<showonepage>false</showonepage>
|
|
||||||
<orientation>horizontal</orientation>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="group">
|
|
||||||
<width>615</width>
|
|
||||||
<height>325</height>
|
|
||||||
<top>100%</top>
|
|
||||||
<control type="group">
|
|
||||||
<control type="button" id="200">
|
|
||||||
<description>Manual Login button</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff585858">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30540][/B][/UPPERCASE]</label>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>35</top>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<ondown>201</ondown>
|
|
||||||
<onup>155</onup>
|
|
||||||
</control>
|
|
||||||
|
|
||||||
<control type="button" id="201">
|
|
||||||
<description>Cancel</description>
|
|
||||||
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
|
|
||||||
<texturefocus border="5" colordiffuse="ff585858">box.png</texturefocus>
|
|
||||||
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
|
|
||||||
<font>font10</font>
|
|
||||||
<textcolor>ffa6a6a6</textcolor>
|
|
||||||
<focusedcolor>white</focusedcolor>
|
|
||||||
<align>center</align>
|
|
||||||
<width>100%</width>
|
|
||||||
<height>50</height>
|
|
||||||
<top>90</top>
|
|
||||||
<onup>200</onup>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</controls>
|
|
||||||
</window>
|
|
|
@ -8,7 +8,7 @@
|
||||||
<description>Background fade</description>
|
<description>Background fade</description>
|
||||||
<width>100%</width>
|
<width>100%</width>
|
||||||
<height>100%</height>
|
<height>100%</height>
|
||||||
<texture>emby-bg-fade.png</texture>
|
<texture>bg-fade.png</texture>
|
||||||
</control>
|
</control>
|
||||||
|
|
||||||
<control type="group">
|
<control type="group">
|
||||||
|
@ -22,12 +22,12 @@
|
||||||
</control>
|
</control>
|
||||||
|
|
||||||
<control type="image">
|
<control type="image">
|
||||||
<description>Emby logo</description>
|
<description>Plex logo</description>
|
||||||
<texture>emby-icon.png</texture>
|
<texture>plex-logo.png</texture>
|
||||||
<aspectratio>keep</aspectratio>
|
<aspectratio>keep</aspectratio>
|
||||||
<height>30</height>
|
<height>34</height>
|
||||||
<top>20</top>
|
<top>20</top>
|
||||||
<left>370</left>
|
<left>-285</left>
|
||||||
</control>
|
</control>
|
||||||
|
|
||||||
<control type="image" id="150">
|
<control type="image" id="150">
|
||||||
|
@ -36,7 +36,7 @@
|
||||||
<aspectratio>keep</aspectratio>
|
<aspectratio>keep</aspectratio>
|
||||||
<height>34</height>
|
<height>34</height>
|
||||||
<top>20</top>
|
<top>20</top>
|
||||||
<left>285</left>
|
<left>370</left>
|
||||||
</control>
|
</control>
|
||||||
|
|
||||||
<control type="image">
|
<control type="image">
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
<height>0.5</height>
|
<height>0.5</height>
|
||||||
<top>70</top>
|
<top>70</top>
|
||||||
<left>-5</left>
|
<left>-5</left>
|
||||||
<texture colordiffuse="ff484848" border="90,3,90,3">emby-separator.png</texture>
|
<texture colordiffuse="ff484848" border="90,3,90,3">separator.png</texture>
|
||||||
</control>
|
</control>
|
||||||
|
|
||||||
<control type="group">
|
<control type="group">
|
Before Width: | Height: | Size: 194 B After Width: | Height: | Size: 194 B |
Before Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
BIN
resources/skins/default/media/plex-logo.png
Normal file
After Width: | Height: | Size: 6 KiB |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |