You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
1.8 KiB
82 lines
1.8 KiB
from plex.interfaces.channel import ChannelInterface
|
|
from plex.interfaces.library import LibraryInterface
|
|
from plex.interfaces.library.metadata import LibraryMetadataInterface
|
|
from plex.interfaces.plugin import PluginInterface
|
|
from plex.interfaces.plugin.preferences import PluginPreferencesInterface
|
|
from plex.interfaces.preferences import PreferencesInterface
|
|
from plex.interfaces.root import RootInterface
|
|
from plex.interfaces.section import SectionInterface
|
|
from plex.interfaces.status import StatusInterface
|
|
from plex.interfaces.timeline import TimelineInterface
|
|
|
|
|
|
# TODO automatic interface discovery
|
|
|
|
INTERFACES = [
|
|
RootInterface,
|
|
|
|
# /
|
|
ChannelInterface,
|
|
StatusInterface,
|
|
|
|
# /library
|
|
LibraryInterface,
|
|
LibraryMetadataInterface,
|
|
SectionInterface,
|
|
|
|
# /:
|
|
PreferencesInterface,
|
|
TimelineInterface,
|
|
|
|
# /:/plugins
|
|
PluginInterface,
|
|
PluginPreferencesInterface
|
|
]
|
|
|
|
|
|
def get_interfaces():
|
|
for interface in INTERFACES:
|
|
if interface.path:
|
|
path = interface.path.strip('/')
|
|
else:
|
|
path = ''
|
|
|
|
if path:
|
|
path = path.split('/')
|
|
else:
|
|
path = []
|
|
|
|
yield path, interface
|
|
|
|
|
|
def construct_map(client, d=None, interfaces=None):
|
|
if d is None:
|
|
d = {}
|
|
|
|
if interfaces is None:
|
|
interfaces = get_interfaces()
|
|
|
|
for path, interface in interfaces:
|
|
if len(path) > 0:
|
|
key = path.pop(0)
|
|
else:
|
|
key = None
|
|
|
|
if key == '*':
|
|
key = None
|
|
|
|
if len(path) == 0:
|
|
d[key] = interface(client)
|
|
continue
|
|
|
|
value = d.get(key, {})
|
|
|
|
if type(value) is not dict:
|
|
value = {None: value}
|
|
|
|
construct_map(client, value, [(path, interface)])
|
|
|
|
d[key] = value
|
|
|
|
return d
|