PlexKodiConnect/resources/lib/playlists/pms.py

146 lines
4.7 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Functions to communicate with the currently connected PMS in order to
manipulate playlists
"""
from __future__ import absolute_import, division, unicode_literals
from logging import getLogger
from ..plex_api import API
from ..downloadutils import DownloadUtils as DU
from .. import utils, app, variables as v
from ..exceptions import PlaylistError
###############################################################################
LOG = getLogger('PLEX.playlists.pms')
###############################################################################
def all_playlists():
"""
Returns an XML with all Plex playlists or None
"""
xml = DU().downloadUrl('{server}/playlists')
try:
xml.attrib
except (AttributeError, TypeError):
LOG.error('Could not download a list of all playlists')
xml = None
return xml
def get_playlist(plex_id):
"""
Fetches the PMS playlist/playqueue as an XML. Pass in playlist id
Returns None if something went wrong
"""
xml = DU().downloadUrl("{server}/playlists/%s/items" % plex_id)
try:
xml.attrib
except AttributeError:
xml = None
return xml
def initialize(playlist, plex_id):
"""
Initializes a new playlist on the PMS side. Will set playlist.plex_id and
playlist.plex_updatedat. Will raise PlaylistError if something went wrong.
"""
LOG.debug('Initializing the playlist with Plex id %s on the Plex side: %s',
plex_id, playlist)
params = {
'type': v.PLEX_PLAYLIST_TYPE_FROM_KODI[playlist.kodi_type],
'title': playlist.plex_name,
'smart': 0,
'uri': ('library://None/item/%s' % (utils.quote('/library/metadata/%s'
% plex_id, safe='')))
}
xml = DU().downloadUrl(url='{server}/playlists',
action_type='POST',
parameters=params)
try:
xml[0].attrib
except (TypeError, IndexError, AttributeError):
LOG.error('Could not initialize playlist on Plex side with plex id %s',
plex_id)
raise PlaylistError('Could not initialize Plex playlist %s', plex_id)
api = API(xml[0])
playlist.plex_id = api.plex_id
playlist.plex_updatedat = api.updated_at()
def add_item(playlist, plex_id):
"""
Adds the item with plex_id to the existing Plex playlist (at the end).
Will set playlist.plex_updatedat
Raises PlaylistError if that did not work out.
"""
params = {
'uri': ('library://None/item/%s' % (utils.quote('/library/metadata/%s'
% plex_id, safe='')))
}
xml = DU().downloadUrl(url='{server}/playlists/%s/items' % playlist.plex_id,
action_type='PUT',
parameters=params)
try:
xml[0].attrib
except (TypeError, IndexError, AttributeError):
LOG.error('Could not initialize playlist on Plex side with plex id %s',
plex_id)
raise PlaylistError('Could not item %s to Plex playlist %s',
plex_id, playlist)
api = API(xml[0])
playlist.plex_updatedat = api.updated_at()
def add_items(playlist, plex_ids):
"""
Adds all plex_ids (a list of ints) to a new Plex playlist.
Will set playlist.plex_updatedat
Raises PlaylistError if that did not work out.
"""
params = {
'type': v.PLEX_PLAYLIST_TYPE_FROM_KODI[playlist.kodi_type],
'title': playlist.plex_name,
'smart': 0,
'uri': ('server://%s/com.plexapp.plugins.library/library/metadata/%s'
% (app.CONN.machine_identifier,
','.join(unicode(x) for x in plex_ids)))
}
xml = DU().downloadUrl(url='{server}/playlists/',
action_type='POST',
parameters=params)
try:
xml[0].attrib
except (TypeError, IndexError, AttributeError):
LOG.error('Could not add items to a new playlist %s on Plex side',
playlist)
raise PlaylistError('Could not add items to a new Plex playlist %s' %
playlist)
api = API(xml[0])
playlist.plex_id = api.plex_id
playlist.plex_updatedat = api.updated_at()
def metadata(plex_id):
"""
Returns an xml with the entire metadata like updatedAt.
"""
xml = DU().downloadUrl('{server}/playlists/%s' % plex_id)
try:
xml.attrib
except AttributeError:
xml = None
return xml
def delete(playlist):
"""
Deletes the playlist from the PMS
"""
DU().downloadUrl('{server}/playlists/%s' % playlist.plex_id,
action_type="DELETE")