pkkid / python-plexapi Goto Github PK
View Code? Open in Web Editor NEWPython bindings for the Plex API.
License: BSD 3-Clause "New" or "Revised" License
Python bindings for the Plex API.
License: BSD 3-Clause "New" or "Revised" License
It seems recentlyAdded is missing from LibrarySection. Is that deprecated? Should I use Library.recentlyAdded instead?
Hello,
The search example doesn't work. (example #5)
All other examples work really well. Maybe there was an update in the latest Plex server version?
Thanks anyway for this great API :)
I cant seem to track this bug down, but the URL has an additional ?
mark just before the X-Plex-Token
paramater (should be an &
):
plex.library.get('9').getStreamUrl()
produces:
http://localhost:10041/video/:/transcode/universal/start?path=http%3A%2F%2F127.0.0.1%3A32400%2Flibrary%2Fmetadata%2F1450&mediaIndex=0&X-Plex-Platform=Chrome©ts=1&offset=0?X-Plex-Token=pRcNNDBmZUYkBWdAUaYa
Notice the end:
..©ts=1&offset=0?X-Plex-Token=pRcNNDBmZUYkBWdAUaYa
When I try to connect with the user owning the server, it doesn't work.
When I connect with a user who has it as a shared server, it works.
All of this is done from a remote location.
ERROR:plexapi:http://172.x.x.x:32400: HTTPConnectionPool(host='172.x.x.x', port=32400): Max retries exceeded with url: /?X-Plex-Token=(token) (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.HTTPConnection object at 0x10a434050>, 'Connection to 172.x.x.x timed out. (connect timeout=5)'))
ERROR:plexapi:https://10-x-x-x.somthg.plex.direct:32400: HTTPSConnectionPool(host='10-x-x-x.somthg.plex.direct', port=32400): Max retries exceeded with url: /?X-Plex-Token=(token) (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x10a434250>, 'Connection to 10-x-x-x.somthg.plex.direct timed out. (connect timeout=5)'))
ERROR:plexapi:https://172-x-x-x.somthg.plex.direct:32400: HTTPSConnectionPool(host='172-x-x-x.somthg.plex.direct', port=32400): Max retries exceeded with url: /?X-Plex-Token=(token) (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x10a4349d0>, 'Connection to 172-x-x-x.somthg.plex.direct timed out. (connect timeout=5)'))
ERROR:plexapi:http://10.x.x.x:32400: HTTPConnectionPool(host=’10.x.x.x', port=32400): Max retries exceeded with url: /?X-Plex-Token=(token) (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.HTTPConnection object at 0x10a434dd0>, 'Connection to 10.90.165.4 timed out. (connect timeout=5)'))
INFO:plexapi:Testing connection: https://172-x-x-x.somthg.plex.direct:32400 ERR
INFO:plexapi:Testing connection: https://10-x-x-x.somthg.plex.direct:32400 ERR
INFO:plexapi:Testing connection: https://62-x-x-x.somthg.plex.direct:32400 OK
INFO:plexapi:Testing connection: http://172.x.x.x:32400 ERR
INFO:plexapi:Testing connection: http://10.x.x.x:32400 ERR
INFO:plexapi:Testing connection: http://62.x.x.x:32400 OK
INFO:plexapi:Connecting to server: None
Traceback (most recent call last):
File "/Users/myuser/PycharmProjects/PlexCompanion/test1.py", line 12, in
print movie.checkExisting()
File "/Users/myuser/PycharmProjects/PlexCompanion/PlexAlert/Movie.py", line 63, in checkExisting
for video in plex.search(self.name):
AttributeError: 'NoneType' object has no attribute 'search'
the logfile should be made at the same location as teh api or atleast make the dir if it dont exist.
From Bug #2.
We can't assume we have write permission at the location of the API. BUt if we're not auto-creating the directory, we should be doing that.
The Series
and Show
objects now contain a method called getStreamURL
which produces an invalid URL.
Should the code be restructured to account for this? Thinking outloud, mabe the inheritance could be something like:
Video <- PlayableVideo <- Episode
and
Video <- Show
Hi mjs,
Awesome work, keep it up!
So Plex music support happened ;)
I noticed plexapi doesnt support music media, only video with many types (show, movie, episode, season, etc). Fully understand it's not an easy feat to get music support in as nice as video.
Would love it if things like sessions do show a minimal set of info though. Right now it strictly handles video only (https://github.com/mjs7231/python-plexapi/blob/master/plexapi/server.py#L102)
I'm not certain this is a bug and not bad coding on my part (apologies if it is the latter), but in my usage of python-plexapi I occasionally end up with a client sitting at the user/pin screen. In this instance, if I try to access the timeline, it just seems to hang...shouldn't this connection attempt timeout? I noticed the timeline definition doesn't pass the TIMEOUT value like other calls to requests.get do:
def timeline(self):
url = self.url('timeline/poll')
params = {'wait':1, 'commandID':4}
xml_text = requests.get(url, params=params, headers=BASE_HEADERS).text
return ElementTree.fromstring(xml_text)
It would be nice for external library usage to be able to set the Plex-Token externally in the config, not having to re-authenticate.
How do we get a list of playlists on the server?
Can't see anything that hits the endpoint /playlists/all
A search for Marvel's The Avengers return with a (500) internal_server_error
2015-07-08 14:25:44.419: test_004_search_movie
2015-07-08 14:25:44.877: ←[91mFAIL!: (500) internal_server_error←[0m
2015-07-08 14:25:44.879: Runtime: 0.460s
2015-07-08 14:25:44.880: Queries: 1
2015-07-08 14:25:44.881:
2015-07-08 14:25:44.883: Tests Run: 1
2015-07-08 14:25:44.885: Tests Passed: 0
2015-07-08 14:25:44.886: Tests Failed: 1
MOVIE_TITLE = 'Marvel's The Avengers'
We need the ability to add items to a playlist. Right now it's read only.
Hi
My android smartphone client is connected to the plex media server. It is ready to display media. When I use the Python plex api to play media using client.playMedia(item), items displays correctly on my client screen.
But I am unable to cast it on another screen using Chromecast. When I try casting, it tries and gives up.
All other content like youtube etc. Iam able to cast. It is only items playing via the Python API, I am not able to cast.
Any ideas?
https://github.com/mjs7231/python-plexapi/blob/master/plexapi/client.py#L68
there is no self.address it was removed in 84a6999
I may be wrong, but currently we can only get them directly from the library:
plex.library.unwatched()
Hi
I was really looking forward to using this API package (thanks a ton for creating it).
I am using WinPython and am trying some simple stuff following the examples but I am getting errors:
from plexapi.server import PlexServer
plex = PlexServer()
The above works fine. I have 1 client (my android phone) connected to the Plex server and I want to get name. I get the error:
for client in plex.clients():
print(client.name)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-39-95657ebdc665> in <module>()
1 for client in plex.clients():
----> 2 print(client.name)
AttributeError: 'PlexClient' object has no attribute 'name'
Doing help(client) confirms client doesn't have name attribute. So I don't know why the examples listed it. I have exactly 1 playlist containing 2 photos. This works fine:
for playlist in plex.playlists():
for item in playlist.items():
print(item)
<Photo:15669:b'P1050130'>
<Photo:15670:b'P1050131'>
Finally, I want to play the playlist on my phone so I do this and again get an error.
client.playMedia(playlist)
File "<string>", line unknown
ParseError: syntax error: line 1, column 0
I get the first photo on my phone and that is it. What is going on here? Am I doing something wrong? Please help.
Being able to compare utils.NA
to None or False would really help.
Hi,
I was using plexapi successfully for a while and then moved to a new place, havent touched it in a while.
Now I can no longer connect to plex server using plexapi.server.PlexServer. I get the following error:
In [1]: from plexapi.server import PlexServer
In [2]: ps = PlexServer()
---------------------------------------------------------------------------
NotFound Traceback (most recent call last)
<ipython-input-2-553a4ba3c216> in <module>()
----> 1 ps = PlexServer()
/Users/eric/miniconda3/envs/plex/lib/python2.7/site-packages/plexapi/server.pyc in __init__(self, baseurl, token, session)
25 self.token = token
26 self.session = session or requests.Session()
---> 27 data = self._connect()
28 self.friendlyName = data.attrib.get('friendlyName')
29 self.machineIdentifier = data.attrib.get('machineIdentifier')
/Users/eric/miniconda3/envs/plex/lib/python2.7/site-packages/plexapi/server.pyc in _connect(self)
48 except Exception as err:
49 log.error('%s: %s', self.baseurl, err)
---> 50 raise NotFound('No server found at: %s' % self.baseurl)
51
52 @property
NotFound: No server found at: http://localhost:32400
Note however that if I'm using the MyPlexAccount method, it works. Interestingly, after I create an account with MyPlexAccount, connect through the account, then plex=PlexServer() works fine.
Any idea/suggestion?
I'm using plexapi 2.0.2 with python 2.7
Thanks!
Hey guys,
Sometimes I get timeout exceptions:
[ERROR]: Exception: HTTPConnectionPool(host='localhost', port=32400): Read timed out. (read timeout=5)
After a quick look in the source, I think there should be a 30 second timeout, or am I wrong?
Thanks
Michael
I'd like to incorporate some automated tests into the project, especially for the code submitted for #7
In the past, i've used py.test but id be open to another framework if you are partial to one.
I'd love to try this library for https://github.com/pannal/Sub-Zero.bundle, but there seems to be no possibility to set the CONFIG stuff externally. I can't rely on any ~/.config stuff, because plugins in Plex are executed inside a sandbox.
I have a Music section and photos and I'm not getting those libraries.
<Directory allowSync="0" art="/:/resources/artist-fanart.jpg" composite="/library/sections/3/composite/1458279050" filters="1" refreshing="0" thumb="/:/resources/artist.png" key="3" type="artist" title="Music" agent="com.plexapp.agents.lastfm" scanner="Plex Music Scanner" language="en" uuid="ab1afce0-4f31-4fd5-845b-73add7bf6748" updatedAt="1458279050" createdAt="1387300385">
my sections only has my movie sections,
no errors were generated in getting sections.
The output from http://localhost:32400/library/sections has those sections as shown by the above output.
music = plex.library.section('Music')
Fails with
plexapi.exceptions.NotFound: Invalid library section: Music
I was wondering if the API was able to handle a non-owner? I can get watch status of owner, but not another user; it returns the watch status of the owner. I am trying to get a list if watched shows from each user on the plex server, so I can delete shows that have been watched by everyone.
Maybe I'm using the API incorrectly. As a side note, when I set a breakpoint in the debugger at line 88 (if filter == 'unwatched':
)and type 'show' in the debugger; they data changes every time I type show. First time itshows show object, third+ time it shows an episode object.
Here is the script I was trying to get to work.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim: set ft=python ts=4 sw=4 sts=4 et :
"""
PlexAPI Manage
Generates a list of files which may be deleted based on being watched by all
users and matching a base path.
"""
import sys
from os.path import dirname, abspath
sys.path.append(dirname(dirname(abspath(__file__))))
from plexapi.myplex import MyPlexUser
from pprint import pprint
import plexapi
plexapi.TIMEOUT = 30
ADMIN = ( '[email protected]', 'password' )
USERS = [
ADMIN,
( '[email protected]', 'password' ),
]
SECTIONS = [
( 'Plex', ('TV Shows',), ('/media/tv-shows', ) ),
]
class ListDiffer(object):
"""A list difference calculator.
"""
def __init__(self, current_list, past_list):
self.current_list, self.past_list = current_list, past_list
try:
self.current_set = set((current_list))
self.past_set = set((past_list))
except TypeError:
self.current_set = set(map(tuple, current_list))
self.past_set = set(map(tuple, past_list))
def diff(self):
'''symetric_differences lists ALL differences; both added and removed
'''
return self.current_set.symmetric_difference(self.past_set)
def common(self):
'''Contain elements that are in both; all common, added and removed
'''
return self.current_set.union(self.past_set)
def added(self):
'''Lists differences only; in this case will list all new elements in current_set
'''
return self.current_set.difference(self.past_set)
def removed(self):
'''Lists differences only; in this case will list all removed items from past_set
'''
return self.past_set.difference(self.current_set)
def unchanged(self):
'''Contains elements common to both; in this case will list unchanged elements
'''
return self.current_set.intersection(self.past_set)
def video_paths(plex, sections=None, paths=None, filter='unwatched'):
'''Returns a file list of video absolute paths based on filter.
sections: plexapi:section
paths: list of root paths to accept
filter: watched|unwatched
'''
file_list = []
if not sections:
sections = plex.library.sections()
if not paths:
paths = []
for section_name in sections:
section = plex.library.section(section_name)
for show in section.all():
if filter == 'unwatched':
show_filter = show.unwatched()
elif filter == 'watched':
show_filter = show.watched()
else:
continue
for episode in show_filter:
print episode.title
for media in episode.media:
for part in media.parts:
if paths:
for path in paths:
if part.file.startswith(path):
print part.file
file_list.append(part.file)
break
else:
file_list.append(part.file)
return file_list
class Users(object):
def __init__(self):
self.users = {}
def signin(self, user_id, password, server):
if user_id in self.users:
user = self.users[user_id]
else:
user = self.users[user_id] = MyPlexUser.signin(user_id, password)
resource = user.getResource(server)
# XXX: Hack to allow non-owned user connections
#resource.owned = True
plex = resource.connect()
return plex
def common_watched(args):
users = Users()
watched = []
for user_id, password in USERS:
for resource, sections, paths in SECTIONS:
plex = users.signin(user_id, password, resource)
watched.append(
video_paths(plex,
sections=sections,
paths=paths,
filter='watched')
)
# XXX: Only works for 2 users at moment...
if len(watched) == 2:
diff = ListDiffer(watched[0], watched[1])
pprint( watched )
def main(args):
common_watched(args)
if __name__ == '__main__':
main(args)
I have photo album A which has two sub albums B and C. All the jpegs are inside B and C. How do I get plexapi to display photos in nested albums. It shows up fine in plex web client.
Hey,
I've been looking through your code to decide whether to replace https://github.com/fuzeman/plex.py in https://github.com/pannal/Sub-Zero.bundle with your library.
What I've noticed is that you are using plain requests.get calls for your HTTP queries, and you don't initialize a Session to get the advantages of keepalive. Is there any reason for this?
I have the Plex iPhone app connected to my server, and the web app connected, but even while actively streaming to my iPhone, nothing is returned by plex.clients()
:
In [1]: from plexapi.myplex import MyPlexUser
In [2]: user = MyPlexUser.signin('ME', 'SEKRIT')
In [3]: plex = user.getServer('MyServer').connect()
In [4]: plex.clients()
Out[4]: []
Are my expectations incorrect?
Can you add a function to parse the results of hitting http://localhost:32400/status/sessions/history/all?
Using your script right now. Would be nice to get a list of dictionaries with data like last video watched and the time
This looks like a regression on the Plex Server side of things.
I may have to work around it.
Been poking around after the SSL announcement today. We may be able to update the API to use this without much effort on our end. There are currently only 5 references to http: in the plexapi source:
plexapi/client.py:66: return 'http://%s:%s/player/%s' % (self.address, self.port, path.lstrip('/'))
plexapi/video.py:80: params['path'] = 'http://127.0.0.1:32400%s' % self.key
plexapi/server.py:43: if address.startswith('http://'):
plexapi/server.py:106: url = 'http://%s:%s/%s' % (self.address, self.port, path.lstrip('/'))
plexapi/utils.py:55: addr = addr.replace('http://', '')
It looks like the plex web client is now loading https://plex.tv/api/resources?includeHttps=1 to find available servers, then tests and continues to communicate to these servers via HTTPS URLs that look like the following:
Testing connection to server at https://192-168-1-131.de28ba8634fc44a46.plex.direct:32400/
Testing connection to server at https://00-00-00-00.de28ba8634fc44a46.plex.direct:32400/
It doesn't appear chrome is getting the server list from https://plex.tv/pms/servers.xml?includeLite=1 anymore (which is how plexapi currently gets the server list)
I'm doing some pretty basic analysis of which attributes exist on which library types. Going to use this bug as a place to take notes. It's also somewhat interesting. The code is split up into two major base classes (Audio & Video). The idea is that any attrs in all {artist, album, track} will be put in the base class for Audio. Any attrs in all {movie, show, season, episode} will be put in the base class for Video. All other attrs will be placed in their proper subclasses.
After scanning all items in my library, the following table is where I see attributes defined:
http://pastebin.com/raw/3usn8A70
Maybe I'm missing something, but I just can't figure out how to get a list all audio albums with this API. The equivalent REST API path would be:
/library/sections/<section_id>/albums
I was trying to call "searchAlbums()" with no params, but that was raising an error:
File "./api-test.py", line 84, in <module>
main()
File "./api-test.py", line 79, in main
generate_playlist("cask.local", name, list_size)
File "./api-test.py", line 41, in generate_playlist
all_albums = music_section.searchAlbums()
File "/usr/local/lib/python2.7/dist-packages/PlexAPI-2.0.0a_.................................._.version.of.this.api-py2.7.egg/plexapi/library.py", line 270, in searchAlbums
return self.search(libtype='album', **kwargs)
File "/usr/local/lib/python2.7/dist-packages/PlexAPI-2.0.0a_.................................._.version.of.this.api-py2.7.egg/plexapi/library.py", line 193, in search
if libtype is not None: args['type'] = utils.searchType(libtype)
File "/usr/local/lib/python2.7/dist-packages/PlexAPI-2.0.0a_.................................._.version.of.this.api-py2.7.egg/plexapi/utils.py", line 261, in searchType
if libtype in SEARCHTYPES + SEARCHTYPESSTRS:
TypeError: unsupported operand type(s) for +: 'dict' and 'list'
Hello there.
Thanks for this, it has been incredibly helpful.
However, the clients list (as specified in example 3) is empty, as I believe plex no longer has a '\clients' url. At least with both my PMP and mobile clients connected, that container is empty. I believe now this needs to be pulled from 'https://plex.tv/pms/resources'. Is this correct? If so, can the code be adjusted to that?
Thanks
I try to do some searches like:
I figured to use the generic search method of a MovieSection def search(self, title, filter='all', vtype=None, **tags)
with actor=Name
tags and filter='unwatched'
.
But the method expects an Actor object not a String.
Could you give an example how you would do it? I don't see the possibility to get the Actor object from a name String.
Btw great work and thanks for making it public.
I noticed the remote control API was updated and mentions that the play media action now supports the offset argument. Is it possible to get that support added here? I find it would be nice to be able to resume something from where you left off, should the need arise.
I added a line to the setParameters function for it, and it works for me:
if offset is not None: params['offSet'] = offset # offset value in ms
I was trying out Plex Api for my python Voice Assistant, and I could not get a lot of stuff to work yet.
I need just a simple thing. A user asks with voice to play some track. This track name is then passed to the PLEX api's search, and I want to play the first entry of it, or make a playlist out of all entries and play them.
Or make a random playlist out of all music entries (songs) and just switch to the one that was found by user's query.
For example, saying "AI, Play Joe Satriani", should start playing all Joe Satriani songs it found in random or alphabet order. Once it finished playing it can either just start playing them again, or switch to another random song.
These are all accepted behaviours, at the moment I'm just looking for a simpler one.
Thanks.
The problems I encountered, is that I don't understand what 'section' means? It's certainly not a library name. But I get errors when trying to pass anything like MUSIC or music or Music into it, and then 'get'.
Here is the code I tried:
for client in plex.clients():
print(client.title)
m = plex.library.section('Music').get(plex.search('Joe Satriani')[0])
client.playMedia(m)
OR THIS ONE
client.playMedia(plex.search('Joe Satriani')[0])
Hello,
Thanks for putting the API together.
These two commands return very different results:
plex.library.get('Game of Thrones').episodes()
Out[49]:
[<Episode:The.Red.Woman>,
<Episode:Home>,
<Episode:Oathbreaker>,
<Episode:Book.of.the.Stranger>]
vs.
got = plex.library.get('Game of Thrones')
got.episodes()
Out[53]: []
How come?
Its a bit more direct than having to identify a video by a query string (especially when looking for an episode of a tv series)
re #2
>>> rev = plex.library.get('Revenge')
>>> print(rev)
<Show:b'Revenge'>
>>> eps = rev.episodes()
>>> print(eps)
[<Episode:b'Pilot'>, <Episode:b'Trust'>]
>>> rev.searchEpisodes('Trust')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
I found this: http://stackoverflow.com/questions/3283441/python-nonetype-is-not-callable-error
but i couldnt find a type = None
anywhere
Am I calling searchEpisodes
incorrectly or is this a python bug?
The Plex XML output orders Seasons and Episodes. Plex JS uses this ordering to name episodes in the Plex GUI.
Should be able to set
episode_obj.episode_number = X
episode_obj.season_number = X
in the Episode class.
Also would be nice to have a definite integer attribute for season number as well, could be handled in the same way.
I'm trying to get the genres for a given show and I keep getting "NA" returned for everything I try.
I can get genres and roles for Movies without issue.
I'm wondering if I am not using this properly for shows. This what I am trying:
show = plex.library.section("TV Shows").get("Almost Human")
foundgenres = show.genres
I'm expecting foundgenres above would be a list similar to what is returned when querying the genres for a movie, though instead of a list I'm getting "NA"
I get a similar result if I replace "genres" with "roles." Summary, type, year, duration, etc are all returned as expected, however. Am I doing something wrong here?
I'm finding it hard to figure out what exactly this API Can do, other than the examples listed in README.md, I'm finding it pretty difficult to explore the different options.
At this point what I'm doing consists of using help() to try and figure what each object/method can do. This doesn't really seem "scalable" and is fairly time consuming.
Is there a readthedocs webpage or something?
I have limited disk space, so I've been running a script that gathers all watched episodes and deletes them, then refreshes the plex media server. Works great. But then I set up Plex Home for other family members, and I still need to delete the episodes they've watched. But even though I'm the admin user, I cannot see the state of the shows they've watched. I even tried using their login/password to authenticate with my script, but then the script doesn't work at all, because they aren't the administrator.
Is there any way the API can be used to see the watched state of episodes for other Plex Home child accounts?
There are several APIs such as the thumbUrl
propery of Video
which return a URL, using an object that may or may not have been fetched at the time of the request:
https://github.com/mjs7231/python-plexapi/blob/master/plexapi/video.py#L261
This results in the URL being combined from the Plex base URL, plus a _NA
object stringified, giving an invalid URL such as http://127.0.0.1:32400/__NA__
. I think it's more reasonable to return either a None
or _NA
object in these cases.
In some cases the Plex XML API's are passing a key of /library/metadata/<key>/children
when in fact the key should really just be /library/metadata/<key>
without the /children part at the end. This is causing problems in PlexPartialObject where it never thinks it has the full object, because we don't have the correct reference to the items main page. Currently we see this in the following objects from Plex.
To get around this, we added a flag for objects: FIX_BUG_50
to note we are doing something weird to get around this issue.
pi@zogg:~ $ cat /home/pi/.pip/pip.log
------------------------------------------------------------
/usr/bin/pip run on Mon Nov 21 05:40:41 2016
Downloading/unpacking plexapi
Getting page https://pypi.python.org/simple/plexapi/
URLs to search for versions for plexapi:
* https://pypi.python.org/simple/plexapi/
Analyzing links from page https://pypi.python.org/simple/plexapi/
Found link https://pypi.python.org/packages/01/8e/eca1d9abe0432fef7f6a4c86af558c61631390f35b705a35628ae2bd7f84/PlexAPI-0.2.tar.gz#md5=96f5513802c24a2bc69817ffa976bf18 (from https://pypi.python.org/simple/plexapi/), version: 0.2
Found link https://pypi.python.org/packages/06/31/0ce446d6717469c8f1cec0c40feacfb587a31d97fb4cc3c79b5a9d4de8e4/PlexAPI-0.9.1.tar.gz#md5=f8093e9ac642e18de6588e4b9fa6eda4 (from https://pypi.python.org/simple/plexapi/), version: 0.9.1
Found link https://pypi.python.org/packages/0b/92/2c57d5e2d758d0f5f76ed72f7db0f0dad747831009a54c79991491077fa7/PlexAPI-0.2.3.tar.gz#md5=37a9855e49b345978787dd2c57de807b (from https://pypi.python.org/simple/plexapi/), version: 0.2.3
Found link https://pypi.python.org/packages/0e/6e/56de724747eefe467c42aea34a370afa88a7e90c456eb56aa5ca785fc1ba/PlexAPI-2.0.2.tar.gz#md5=ad898641c7303757d5166df63e9bc872 (from https://pypi.python.org/simple/plexapi/), version: 2.0.2
Found link https://pypi.python.org/packages/0f/f7/e78b6d8c7292fd64832093631125f0fe21ef9f8e72cd4745a3caa168a95d/PlexAPI-0.9.3.tar.gz#md5=020bed6427b6c5e37bed78b4fd00f3ef (from https://pypi.python.org/simple/plexapi/), version: 0.9.3
Found link https://pypi.python.org/packages/1d/c9/ef7b641a7359cee899573c21df85028e2fc417ebef2cb96a91646e865e59/PlexAPI-1.1.0.tar.gz#md5=c310e0a3ec58b61aaeee0578b5921c25 (from https://pypi.python.org/simple/plexapi/), version: 1.1.0
Found link https://pypi.python.org/packages/3a/d0/1a4bd779aa942b0b922981a1a72dcec7728b185cba86b4f6f0c43445f3fd/PlexAPI-0.9.4.tar.gz#md5=8b450b6db481f1174ddc8735d8c0c768 (from https://pypi.python.org/simple/plexapi/), version: 0.9.4
Found link https://pypi.python.org/packages/45/93/5c3165d8e326ef1788f941d979c46c9267be8f7e42235ab58e8c93e1e602/PlexAPI-1.0.2.tar.gz#md5=9113ba80477ca9576d3557668c7ffbc9 (from https://pypi.python.org/simple/plexapi/), version: 1.0.2
Found link https://pypi.python.org/packages/4a/98/6b48bfe331ab61c5ccb2d98dcdde09cbdbe5a9a97bc1b662ccd36352a0b3/PlexAPI-0.2.1.tar.gz#md5=2661674d6ee7ef568b4ab53bc24a409d (from https://pypi.python.org/simple/plexapi/), version: 0.2.1
Found link https://pypi.python.org/packages/9e/93/9b700c5cb93b0a6c4ae6f27b9f900e79c2ef0d8dbb6cca4343e1aac17182/PlexAPI-0.9.2.tar.gz#md5=aa1bf14e2ef35b92e55e3ff4c6f3dd66 (from https://pypi.python.org/simple/plexapi/), version: 0.9.2
Found link https://pypi.python.org/packages/bc/1a/23318d7ccd1871080e4812cb9ba5b5d2726853a4ae347fc29fb42bc8568b/PlexAPI-0.9.6.tar.gz#md5=9feaecf1abb6836def2d090c647f9424 (from https://pypi.python.org/simple/plexapi/), version: 0.9.6
Found link https://pypi.python.org/packages/c2/95/fd31295206450678bd55103d05cacf523134f87f151ec979f098d0a345d6/PlexAPI-0.2.2.tar.gz#md5=a0807ef7c53cea582d9203606b5fefab (from https://pypi.python.org/simple/plexapi/), version: 0.2.2
Found link https://pypi.python.org/packages/c8/5d/6c2bcd44e462a27cfe28bf09aa75236091d92009072327592e4b5eb63288/PlexAPI-1.0.1.tar.gz#md5=d04b5bd6781de6afb9e4394d94c12840 (from https://pypi.python.org/simple/plexapi/), version: 1.0.1
Found link https://pypi.python.org/packages/c8/dc/6184288312afb6722c39b953338088c842a788348015a56f46b4aaad617c/PlexAPI-1.0.0.tar.gz#md5=8e2c115b0c5732c9f5f1bd061a92a265 (from https://pypi.python.org/simple/plexapi/), version: 1.0.0
Found link https://pypi.python.org/packages/db/7a/60e8942d5c75b05ccb39cfb8e57f450e8e90e484b651234902e82b0350cc/PlexAPI-0.9.0.tar.gz#md5=44bc040d3b64a897796695fb296a7801 (from https://pypi.python.org/simple/plexapi/), version: 0.9.0
Found link https://pypi.python.org/packages/e2/11/a09ae8cfb4b999b414468740492a8e033e0c4485ad229f4697fbe58f944f/PlexAPI-2.0.1.tar.gz#md5=14fef6d5a78c4e5b04491e3c65ce2ffd (from https://pypi.python.org/simple/plexapi/), version: 2.0.1
Using version 2.0.2 (newest of versions: 2.0.2, 2.0.1, 1.1.0, 1.0.2, 1.0.1, 1.0.0, 0.9.6, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.2.3, 0.2.2, 0.2.1, 0.2)
Downloading PlexAPI-2.0.2.tar.gz
Downloading from URL https://pypi.python.org/packages/0e/6e/56de724747eefe467c42aea34a370afa88a7e90c456eb56aa5ca785fc1ba/PlexAPI-2.0.2.tar.gz#md5=ad898641c7303757d5166df63e9bc872 (from https://pypi.python.org/simple/plexapi/)
Running setup.py (path:/tmp/pip-build-POcDDg/plexapi/setup.py) egg_info for package plexapi
Warn: pypandoc not found, not converting Markdown to RST
running egg_info
creating pip-egg-info/PlexAPI.egg-info
writing requirements to pip-egg-info/PlexAPI.egg-info/requires.txt
writing pip-egg-info/PlexAPI.egg-info/PKG-INFO
writing top-level names to pip-egg-info/PlexAPI.egg-info/top_level.txt
writing dependency_links to pip-egg-info/PlexAPI.egg-info/dependency_links.txt
writing manifest file 'pip-egg-info/PlexAPI.egg-info/SOURCES.txt'
warning: manifest_maker: standard file '-c' not found
reading manifest file 'pip-egg-info/PlexAPI.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'pip-egg-info/PlexAPI.egg-info/SOURCES.txt'
Source in /tmp/pip-build-POcDDg/plexapi has version 2.0.2, which satisfies requirement plexapi
Requirement already satisfied (use --upgrade to upgrade): requests in /usr/lib/python2.7/dist-packages (from plexapi)
skipping extra security
skipping extra security
skipping extra security
Installing collected packages: plexapi
Running setup.py install for plexapi
Running command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-POcDDg/plexapi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-DPT_pI-record/install-record.txt --single-version-externally-managed --compile
Warn: pypandoc not found, not converting Markdown to RST
running install
running build
running build_py
creating build
creating build/lib.linux-armv7l-2.7
creating build/lib.linux-armv7l-2.7/tests
copying tests/examples.py -> build/lib.linux-armv7l-2.7/tests
copying tests/utils.py -> build/lib.linux-armv7l-2.7/tests
copying tests/tests.py -> build/lib.linux-armv7l-2.7/tests
copying tests/__init__.py -> build/lib.linux-armv7l-2.7/tests
copying tests/findattrs.py -> build/lib.linux-armv7l-2.7/tests
creating build/lib.linux-armv7l-2.7/plexapi
copying plexapi/config.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/myplex.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/compat.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/playlist.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/server.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/sync.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/video.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/audio.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/utils.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/client.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/__init__.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/exceptions.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/media.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/library.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/photo.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/playqueue.py -> build/lib.linux-armv7l-2.7/plexapi
running install_lib
creating /usr/local/lib/python2.7/dist-packages/tests
error: could not create '/usr/local/lib/python2.7/dist-packages/tests': Permission denied
Complete output from command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-POcDDg/plexapi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-DPT_pI-record/install-record.txt --single-version-externally-managed --compile:
Warn: pypandoc not found, not converting Markdown to RST
running install
running build
running build_py
creating build
creating build/lib.linux-armv7l-2.7
creating build/lib.linux-armv7l-2.7/tests
copying tests/examples.py -> build/lib.linux-armv7l-2.7/tests
copying tests/utils.py -> build/lib.linux-armv7l-2.7/tests
copying tests/tests.py -> build/lib.linux-armv7l-2.7/tests
copying tests/__init__.py -> build/lib.linux-armv7l-2.7/tests
copying tests/findattrs.py -> build/lib.linux-armv7l-2.7/tests
creating build/lib.linux-armv7l-2.7/plexapi
copying plexapi/config.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/myplex.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/compat.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/playlist.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/server.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/sync.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/video.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/audio.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/utils.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/client.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/__init__.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/exceptions.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/media.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/library.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/photo.py -> build/lib.linux-armv7l-2.7/plexapi
copying plexapi/playqueue.py -> build/lib.linux-armv7l-2.7/plexapi
running install_lib
creating /usr/local/lib/python2.7/dist-packages/tests
error: could not create '/usr/local/lib/python2.7/dist-packages/tests': Permission denied
----------------------------------------
Cleaning up...
Command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-POcDDg/plexapi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-DPT_pI-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip-build-POcDDg/plexapi
Exception information:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
status = self.run(options, args)
File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 295, in run
requirement_set.install(install_options, global_options, root=options.root_path)
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1436, in install
requirement.install(install_options, global_options, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 707, in install
cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False)
File "/usr/lib/python2.7/dist-packages/pip/util.py", line 716, in call_subprocess
% (command_desc, proc.returncode, cwd))
InstallationError: Command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-POcDDg/plexapi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-DPT_pI-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip-build-POcDDg/plexapi
When trying to use the timeline and isMediaPlaying options I get the following parse error:
requests.exceptions.InvalidURL: Failed to parse: 192-168-1-134.longstingoflettersnumberhere.plex.direct:32400timeline
I'm trying it as follows from a python console:
from plexapi.myplex import MyPlexUser
user = MyPlexUser.signin(PLEXUN, PLEXPW)
plex = user.getResource(PLEXSVR).connect()
client = plex.client(CLIENT)
client.isPlayingMedia()
(OR)
client.timeline()
and then I get the above error.
Am I doing something wrong to cause that parse error?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.