2018-07-12 05:24:27 +10:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
Functions to communicate with the currently connected PMS in order to
|
|
|
|
manipulate playlists
|
|
|
|
"""
|
2018-07-13 02:46:02 +10:00
|
|
|
from __future__ import absolute_import, division, unicode_literals
|
2018-07-12 05:24:27 +10:00
|
|
|
from logging import getLogger
|
|
|
|
|
|
|
|
from ..plex_api import API
|
|
|
|
from ..downloadutils import DownloadUtils as DU
|
2019-03-30 20:32:56 +11:00
|
|
|
from .. import utils, app, variables as v
|
2021-09-13 19:24:06 +10:00
|
|
|
from ..exceptions import PlaylistError
|
|
|
|
|
2018-07-12 05:24:27 +10:00
|
|
|
###############################################################################
|
|
|
|
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,
|
2019-03-30 20:32:56 +11:00
|
|
|
'uri': ('library://None/item/%s' % (utils.quote('/library/metadata/%s'
|
|
|
|
% plex_id, safe='')))
|
2018-07-12 05:24:27 +10:00
|
|
|
}
|
|
|
|
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])
|
2019-06-11 05:29:42 +10:00
|
|
|
playlist.plex_id = api.plex_id
|
2018-07-12 05:24:27 +10:00
|
|
|
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 = {
|
2019-03-30 20:32:56 +11:00
|
|
|
'uri': ('library://None/item/%s' % (utils.quote('/library/metadata/%s'
|
|
|
|
% plex_id, safe='')))
|
2018-07-12 05:24:27 +10:00
|
|
|
}
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
2018-12-25 03:06:01 +11:00
|
|
|
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'
|
2019-02-02 20:53:10 +11:00
|
|
|
% (app.CONN.machine_identifier,
|
|
|
|
','.join(unicode(x) for x in plex_ids)))
|
2018-12-25 03:06:01 +11:00
|
|
|
}
|
|
|
|
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])
|
2019-06-11 05:29:42 +10:00
|
|
|
playlist.plex_id = api.plex_id
|
2018-12-25 03:06:01 +11:00
|
|
|
playlist.plex_updatedat = api.updated_at()
|
|
|
|
|
|
|
|
|
2018-07-12 05:24:27 +10:00
|
|
|
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")
|