Python bindings for the Plex API.

Overview

Python-PlexAPI

https://readthedocs.org/projects/python-plexapi/badge/?version=latest https://codecov.io/gh/pkkid/python-plexapi/branch/master/graph/badge.svg?token=fOECznuMtw https://img.shields.io/github/tag/pkkid/python-plexapi.svg?label=github+release

Overview

Unofficial Python bindings for the Plex API. Our goal is to match all capabilities of the official Plex Web Client. A few of the many features we currently support are:

  • Navigate local or remote shared libraries.
  • Perform library actions such as scan, analyze, empty trash.
  • Remote control and play media on connected clients, including Controlling Sonos speakers
  • Listen in on all Plex Server notifications.

Installation & Documentation

pip install plexapi

Documentation can be found at Read the Docs.

Join our Discord for support and discussion.

Getting a PlexServer Instance

There are two types of authentication. If you are running on a separate network or using Plex Users you can log into MyPlex to get a PlexServer instance. An example of this is below. NOTE: Servername below is the name of the server (not the hostname and port). If logged into Plex Web you can see the server name in the top left above your available libraries.

from plexapi.myplex import MyPlexAccount
account = MyPlexAccount('<USERNAME>', '<PASSWORD>')
plex = account.resource('<SERVERNAME>').connect()  # returns a PlexServer instance

If you want to avoid logging into MyPlex and you already know your auth token string, you can use the PlexServer object directly as above, by passing in the baseurl and auth token directly.

from plexapi.server import PlexServer
baseurl = 'http://plexserver:32400'
token = '2ffLuB84dqLswk9skLos'
plex = PlexServer(baseurl, token)

Usage Examples

# Example 1: List all unwatched movies.
movies = plex.library.section('Movies')
for video in movies.search(unwatched=True):
    print(video.title)
# Example 2: Mark all Game of Thrones episodes watched.
plex.library.section('TV Shows').get('Game of Thrones').markWatched()
# Example 3: List all clients connected to the Server.
for client in plex.clients():
    print(client.title)
# Example 4: Play the movie Cars on another client.
# Note: Client must be on same network as server.
cars = plex.library.section('Movies').get('Cars')
client = plex.client("Michael's iPhone")
client.playMedia(cars)
# Example 5: List all content with the word 'Game' in the title.
for video in plex.search('Game'):
    print('%s (%s)' % (video.title, video.TYPE))
# Example 6: List all movies directed by the same person as Elephants Dream.
movies = plex.library.section('Movies')
elephants_dream = movies.get('Elephants Dream')
director = elephants_dream.directors[0]
for movie in movies.search(None, director=director):
    print(movie.title)
# Example 7: List files for the latest episode of The 100.
last_episode = plex.library.section('TV Shows').get('The 100').episodes()[-1]
for part in last_episode.iterParts():
    print(part.file)
# Example 8: Get audio/video/all playlists
for playlist in plex.playlists():
    print(playlist.title)
# Example 9: Rate the 100 four stars.
plex.library.section('TV Shows').get('The 100').rate(8.0)

Controlling Sonos speakers

To control Sonos speakers directly using Plex APIs, the following requirements must be met:

  1. Active Plex Pass subscription
  2. Sonos account linked to Plex account
  3. Plex remote access enabled

Due to the design of Sonos music services, the API calls to control Sonos speakers route through https://sonos.plex.tv and back via the Plex server's remote access. Actual media playback is local unless networking restrictions prevent the Sonos speakers from connecting to the Plex server directly.

from plexapi.myplex import MyPlexAccount
from plexapi.server import PlexServer

baseurl = 'http://plexserver:32400'
token = '2ffLuB84dqLswk9skLos'

account = MyPlexAccount(token)
server = PlexServer(baseurl, token)

# List available speakers/groups
for speaker in account.sonos_speakers():
    print(speaker.title)

# Obtain PlexSonosPlayer instance
speaker = account.sonos_speaker("Kitchen")

album = server.library.section('Music').get('Stevie Wonder').album('Innervisions')

# Speaker control examples
speaker.playMedia(album)
speaker.pause()
speaker.setVolume(10)
speaker.skipNext()

Running tests over PlexAPI

Use:

tools/plex-boostraptest.py

with appropriate arguments and add this new server to a shared user which username is defined in environment veriable SHARED_USERNAME. It uses official docker image to create a proper instance.

For skipping the docker and reuse a existing server use

python plex-bootstraptest.py --no-docker --username USERNAME --password PASSWORD --server-name NAME-OF-YOUR-SEVER

Also in order to run most of the tests you have to provide some environment variables:

  • PLEXAPI_AUTH_SERVER_BASEURL containing an URL to your Plex instance, e.g. http://127.0.0.1:32400 (without trailing slash)
  • PLEXAPI_AUTH_MYPLEX_USERNAME and PLEXAPI_AUTH_MYPLEX_PASSWORD with your MyPlex username and password accordingly

After this step you can run tests with following command:

py.test tests -rxXs --ignore=tests/test_sync.py

Some of the tests in main test-suite require a shared user in your account (e.g. test_myplex_users, test_myplex_updateFriend, etc.), you need to provide a valid shared user's username to get them running you need to provide the username of the shared user as an environment variable SHARED_USERNAME. You can enable a Guest account and simply pass Guest as SHARED_USERNAME (or just create a user like plexapitest and play with it).

To be able to run tests over Mobile Sync api you have to some some more environment variables, to following values exactly:

  • PLEXAPI_HEADER_PROVIDES='controller,sync-target'
  • PLEXAPI_HEADER_PLATFORM=iOS
  • PLEXAPI_HEADER_PLATFORM_VERSION=11.4.1
  • PLEXAPI_HEADER_DEVICE=iPhone

And finally run the sync-related tests:

py.test tests/test_sync.py -rxXs

Common Questions

Why are you using camelCase and not following PEP8 guidelines?

This API reads XML documents provided by MyPlex and the Plex Server. We decided to conform to their style so that the API variable names directly match with the provided XML documents.

Why don't you offer feature XYZ?

This library is meant to be a wrapper around the XML pages the Plex server provides. If we are not providing an API that is offerered in the XML pages, please let us know! -- Adding additional features beyond that should be done outside the scope of this library.

What are some helpful links if trying to understand the raw Plex API?

Comments
  • Ability to Play Nested Photo Albums

    Ability to Play Nested Photo Albums

    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.

    enhancement 
    opened by cmoulikus 43
  • xml.etree.ElementTree.ParseError: no element found: line 1, column 54

    xml.etree.ElementTree.ParseError: no element found: line 1, column 54

    Hi,

    i installed this plugin on my PMS server: https://github.com/d8ahazard/Cast.bundle when i play something with code below, it actualy plays, but i always receice this error below

    what could be the cause?

    film = plex.library.section('Movies').get('Terminator Genisys')
    client = plex.client("TV Samsung")
    client.playMedia(film)
    
    
    Traceback (most recent call last):
      File "D:/Documents/Downloads/Pyhton/project1/plex.py", line 11, in <module>
        client.playMedia(film)
      File "D:\Documents\Downloads\Pyhton\project1\venv\lib\site-packages\plexapi\client.py", line 486, in playMedia
        }, **params))
      File "D:\Documents\Downloads\Pyhton\project1\venv\lib\site-packages\plexapi\client.py", line 204, in sendCommand
        return query(key, headers=headers)
      File "D:\Documents\Downloads\Pyhton\project1\venv\lib\site-packages\plexapi\client.py", line 168, in query
        return ElementTree.fromstring(data) if data.strip() else None
      File "C:\Users\fabio.pergola\AppData\Local\Programs\Python\Python37\lib\xml\etree\ElementTree.py", line 1316, in XML
        return parser.close()
    xml.etree.ElementTree.ParseError: no element found: line 1, column 54
    
    opened by pergolafabio 31
  • Sync support

    Sync support

    Hi there! I've started working on Mobile Sync support. If anybody has any comments on the code, or just any feature requests — feel free to tell :)

    At the beginning the code can do few useful things:

    1. Initialise the "sync" env: tell the plex.tv that the client supports syncing, and the client can be used as sync-target
    2. Unfortunately I have to "fake" used platform/device info, because transcoding is depends on this values
    3. And finally you can download converted files, by iterating over media parts and looking for ones with required syncItemId

    The reason why I'm started this is simple: I have a WD My Passport Pro which has the Plex onboard and I'd like to have my "travel" library in sync with the main one. I've already started the project for this (andrey-yantsen/plexiglas) but for now there is nothing to see there.

    fix #134

    opened by andrey-yantsen 31
  • Can't connect to server on friend account.

    Can't connect to server on friend account.

    I can connect just fine with admin account (server owner). But if i try to connect to friend accout i get error:

    Traceback (most recent call last):
    
      File "C:\Users\Boris\Desktop\proba.py", line 3, in <module>
    
        plex = account.resource('Plex').connect()
    
      File "C:\Users\Boris\AppData\Local\Programs\Python\Python38-32\lib\site-packages\plexapi\myplex.py", line 963, in connect
    
        return _chooseConnection('Resource', self.name, results)
    
      File "C:\Users\Boris\AppData\Local\Programs\Python\Python38-32\lib\site-packages\plexapi\myplex.py", line 1296, in _chooseConnection
    
        raise NotFound('Unable to connect to %s: %s' % (ctype.lower(), name))
    
    plexapi.exceptions.NotFound: Unable to connect to resource: Plex
    

    "Plex" is a server name. Both client and server are on local network.

    opened by Dr0bac 29
  • Support Casting to Chromecast

    Support Casting to Chromecast

    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?

    enhancement 
    opened by cmoulikus 26
  • Question regarding guid changes in 1.20.0.3125

    Question regarding guid changes in 1.20.0.3125

    With the release of Plex Beta version 1.20.0.3125 the new Plex Movie agent has changed to some funky looking guid format: plex://movie/5d9f34ffb0262f001f6e9703

    Is there any chance you guys know how or can help me convince Plex devs to add something to allow me to still identify which IMDB/TMDB ID is being used to match the file to metadata? For context I am using https://github.com/saltydk/matcharr to fix mismatches and would love to be able to use it on the new agent as well.

    opened by saltydk 25
  • 401 Unauthorized for Samsung TV and Chrome players

    401 Unauthorized for Samsung TV and Chrome players

    Plex Media Server Version : 1.7.6.4058 OS: FreeBSD 11.0-STABLE Python: 2.7.13 pip 9.0.1

    Samsung App version: 3.1.0 (3.8.0)

    websocket-client and requests are installed.

    I'm getting a 401 Unauthorized error when I use the following code, with the Samsung TV and Chrome players,

    Tried both token and MyPlex auth, works with other players like Plex Media Player. Server and Clients are on the same Network.

    Code Used

    #!/usr/local/bin/python2.7
    
    from plexapi.server import PlexServer
    baseurl = 'http://192.168.0.54:32400'
    token = 'TOKEN'
    plex = PlexServer(baseurl, token)
    
    ozzy = plex.library.section('Trailers').get('Ozzy')
    client = plex.client("TV UE40KU6000")
    client.playMedia(ozzy)
    

    Traceback

      File "./test.py", line 9, in <module>
        client = plex.client("TV UE40KU6000")
      File "/usr/local/lib/python2.7/site-packages/plexapi/server.py", line 238, in client
        return PlexClient(baseurl=baseurl, server=self, data=elem)
      File "/usr/local/lib/python2.7/site-packages/plexapi/client.py", line 73, in __init__
        self.connect(timeout=timeout)
      File "/usr/local/lib/python2.7/site-packages/plexapi/client.py", line 87, in connect
        data = self.query(self.key, timeout=timeout)
      File "/usr/local/lib/python2.7/site-packages/plexapi/client.py", line 153, in query
        raise BadRequest('(%s) %s; %s %s' % (response.status_code, codename, response.url, errtext))
    plexapi.exceptions.BadRequest: (401) unauthorized; http://192.168.0.54:32400/resources <html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html>```
    
    
    bug 
    opened by UnR34L 24
  • having trouble with searching using filter!

    having trouble with searching using filter!

    I'm trying to use LibrarySection.search to search using ! in the search filter and when I add the ! after actor, country, director, genre, and writer no matter what value I give it, it just returns every movie in my library. studio! and year! seemed to work but i haven't tested any other filters other then the ones mentioned in this post. what i ran to test is belowis below

    def test(filters):
        print(str(filters) + ": " + str(len(plex.Library.search(**filters))))
    
    test({'actor': 'Will Smith'})
    test({'actor!': 'Will Smith'})
    test({'country': 'USA'})
    test({'country!': 'USA'})
    test({'director': 'Steven Spielberg'})
    test({'director!': 'Steven Spielberg'})
    test({'genre': 'Romance'})
    test({'genre!': 'Romance'})
    test({'genre': 'Comedy'})
    test({'genre!': 'Comedy'})
    test({'studio': 'Pixar'})
    test({'studio!': 'Pixar'})
    test({'year': '1990'})
    test({'year!': '1990'})
    test({'writer': 'Quentin Tarantino'})
    test({'writer!': 'Quentin Tarantino'})
    

    Output

    {'actor': 'Will Smith'}: 21
    {'actor!': 'Will Smith'}: 1780
    {'country': 'USA'}: 1489
    {'country!': 'USA'}: 1780
    {'director': 'Steven Spielberg'}: 16
    {'director!': 'Steven Spielberg'}: 1780
    {'genre': 'Romance'}: 107
    {'genre!': 'Romance'}: 1780
    {'genre': 'Comedy'}: 603
    {'genre!': 'Comedy'}: 1780
    {'studio': 'Pixar'}: 9
    {'studio!': 'Pixar'}: 1771
    {'year': '1990'}: 15
    {'year!': '1990'}: 1765
    {'writer': 'Quentin Tarantino'}: 12
    {'writer!': 'Quentin Tarantino'}: 1780
    

    Am i doing something wrong or is this feature not working correctly?

    opened by meisnate12 22
  • Cannot control client : 406 error

    Cannot control client : 406 error

    Hi,

    i try to control a plex client (PMP on a RPI) using python-plexapi.

    I get a token after using plex-listtokens.py. The tool list many object : Ressources, Devices and one client (my PMP RPI). My Plex Media Server (Ressource) has the same token than my Plex Media Player (Client).

    I made a small python script, where the baseurl is the url of my plex server. When i print the clients list, i can see my client with the title "PlexMediaPlayer". As a result of this script, i always get a 406 error code, with this trace :

    PlexMediaPlayer
    Traceback (most recent call last):
      File "./test.py", line 16, in <module>
        client.goToHome()
      File "/usr/local/lib/python2.7/dist-packages/plexapi/client.py", line 216, in goToHome
        self.sendCommand('navigation/home')
      File "/usr/local/lib/python2.7/dist-packages/plexapi/client.py", line 192, in sendCommand
        return self.query(key, headers=headers)
      File "/usr/local/lib/python2.7/dist-packages/plexapi/client.py", line 164, in query
        raise BadRequest('(%s) %s; %s %s' % (response.status_code, codename, response.url, errtext))
    plexapi.exceptions.BadRequest: (406) not_acceptable; http://10.0.1.35:32433/player/navigation/home?commandID=1&X-Plex-Token=[MY TOKEN]
    

    Is there any step i did forget to control my client ? (i can navigate into my library thru the PlexServer object, list all my movies...)

    #!/usr/bin/env python3
    
    from plexapi.server import PlexServer
    
    baseurl = 'http://10.0.1.41:32400'
    token = '[MY TOKEN]'
    plex = PlexServer(baseurl, token)
    
    for client in plex.clients():
        print(client.title)
    
    client = plex.client("PlexMediaPlayer")
    
    client.connect()
    
    client.goToHome()
    
    bug 
    opened by niko34 22
  • not able to play item on PlexMediaPlayer?

    not able to play item on PlexMediaPlayer?

    I'm sorry if this is covered somewhere, i've searched and searched, and cannot find a reason as to why.

    Example 4: Play the movie Cars on another client.

    Note: Client must be on same network as server.

    cars = plex.library.section('Movies').get('Cars') client = plex.client("Michael's iPhone") client.playMedia(cars)

    (Obviously I have Cars in my library, and I've changed the plex.client accordingly) this works just fine to play on my Roku devices, and my iPhone app, even OpenPHT, but not Plex Media Player?

    I get:

    DEBUG:urllib3.connectionpool:http://192.168.0.110:32400 "GET /clients HTTP/1.1" 200 460 DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 192.168.0.23:32433 DEBUG:urllib3.connectionpool:http://192.168.0.23:32433 "GET /resources HTTP/1.1" 200 None DEBUG:urllib3.connectionpool:http://192.168.0.110:32400 "GET /library HTTP/1.1" 200 289 DEBUG:urllib3.connectionpool:http://192.168.0.110:32400 "GET /library/sections HTTP/1.1" 200 1611 DEBUG:urllib3.connectionpool:http://192.168.0.110:32400 "GET /library/sections/2/all HTTP/1.1" 200 298041 DEBUG:urllib3.connectionpool:Resetting dropped connection: 192.168.0.23 DEBUG:urllib3.connectionpool:http://192.168.0.23:32433 "GET /player/timeline/poll?wait=0&commandID=1 HTTP/1.1" 200 None DEBUG:urllib3.connectionpool:Resetting dropped connection: 192.168.0.23 DEBUG:urllib3.connectionpool:http://192.168.0.23:32433 "GET /player/timeline/subscribe?commandID=2&port=32400&protocol=http HTTP/1.1" 200 None DEBUG:urllib3.connectionpool:http://192.168.0.110:32400 "GET /library/metadata/200471?checkFiles=1&includeExtras=1&includeRelated=1&includeOnDeck=1&includeChapters=1&includePopularLeaves=1&includeConcerts=1&includePreferences=1 HTTP/1.1" 200 30846 DEBUG:urllib3.connectionpool:http://192.168.0.110:32400 "POST /playQueues?includeChapters=1&includeRelated=1&key=/library/metadata/200471&repeat=0&shuffle=0&type=video&uri=library%3A//XXXXXXX/item//library/metadata/200471 HTTP/1.1" 200 30442 DEBUG:urllib3.connectionpool:Resetting dropped connection: 192.168.0.23 Traceback (most recent call last): File "test.py", line 20, in client.playMedia(always) File "/home/derailius/.local/lib/python2.7/site-packages/plexapi/client.py", line 480, in playMedia }, **params)) File "/home/derailius/.local/lib/python2.7/site-packages/plexapi/client.py", line 207, in sendCommand return self.query(key, headers=headers) File "/home/derailius/.local/lib/python2.7/site-packages/plexapi/client.py", line 161, in query response = method(url, headers=headers, timeout=timeout, **kwargs) File "/home/derailius/.local/lib/python2.7/site-packages/requests/sessions.py", line 546, in get return self.request('GET', url, **kwargs) File "/home/derailius/.local/lib/python2.7/site-packages/requests/sessions.py", line 533, in request resp = self.send(prep, **send_kwargs) File "/home/derailius/.local/lib/python2.7/site-packages/requests/sessions.py", line 646, in send r = adapter.send(request, **kwargs) File "/home/derailius/.local/lib/python2.7/site-packages/requests/adapters.py", line 529, in send raise ReadTimeout(e, request=request) requests.exceptions.ReadTimeout: HTTPConnectionPool(host='192.168.0.23', port=32433): Read timed out. (read timeout=30)

    and then after a while Plex Media Player crashes. I've tried different versions of PMP and on different computers. I know there isn't a firewall issue or anything because OpenPHT works just fine. in addition, the NEW Plex player doesn't work either. My preferred player is Plex Media Player. I'm not sure how to proceed, any help would be appreciated.

    opened by derailius 21
  • Improvements in tests process

    Improvements in tests process

    Currently I can see following problems with tests:

    1. [X] Tests which run on Travis-CI depends on external Plex Server
    2. [X] The tests aren't running for pull requests
    3. [X] flake8 executed for each python version, which is senselessly
    4. [X] Deploy to PyPi executed for each python version which lead to errors in uploading
    5. [X] The tests require quite a work on building a library, but even after the library is ready not all tests are passing
    6. [x] Part of tests are require an existence of user PKKid
    7. [x] Some of MyPlexAccount test require that you don't have a PlexPass (and it's not really documented)
    8. [x] My Mobile Sync tests require a Plex Pass on other hand, and this is also not documented
    9. [x] The readme not covers a testing procedure
    10. [x] Test results should be reproducible, without "unstable" tests
    11. [x] Tests agains shared libraries should be easy-to-run, and the should run automatically in Travis

    As for now I've partially resolved first few easy issues, and stuck with generating a proper library: I have no idea how to get tests related to photoalbum to pass, and I need your help here.

    To get my new approach working you have to define PLEXAPI_AUTH_MYPLEX_USERNAME and PLEXAPI_AUTH_MYPLEX_PASSWORD in the your Travis CI ENV variables, instead of PLEXAPI_AUTH_SERVER_BASEURL and PLEXAPI_AUTH_SERVER_TOKEN.

    After each run of travis the newly created server and client would be removed from the MyPlex account.

    You can check the Travis CI output by visiting https://travis-ci.org/andrey-yantsen/python-plexapi/builds/426206148.

    opened by andrey-yantsen 21
  • Bump sphinx from 4.3.2 to 6.1.1

    Bump sphinx from 4.3.2 to 6.1.1

    Bumps sphinx from 4.3.2 to 6.1.1.

    Release notes

    Sourced from sphinx's releases.

    v6.1.1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.1.0

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.0

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.0b2

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.0b1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.3.0

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.2.3

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.2.2

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.2.1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.2.0

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.1.1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.1.0

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.0.2

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.0.1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v5.0.0

    No release notes provided.

    v5.0.0b1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    ... (truncated)

    Changelog

    Sourced from sphinx's changelog.

    Release 6.1.1 (released Jan 05, 2023)

    Bugs fixed

    • #11091: Fix util.nodes.apply_source_workaround for literal_block nodes with no source information in the node or the node's parents.

    Release 6.1.0 (released Jan 05, 2023)

    Dependencies

    Incompatible changes

    • #10979: gettext: Removed support for pluralisation in get_translation. This was unused and complicated other changes to sphinx.locale.

    Deprecated

    • sphinx.util functions:

      • Renamed sphinx.util.typing.stringify() to sphinx.util.typing.stringify_annotation()
      • Moved sphinx.util.xmlname_checker() to sphinx.builders.epub3._XML_NAME_PATTERN

      Moved to sphinx.util.display:

      • sphinx.util.status_iterator
      • sphinx.util.display_chunk
      • sphinx.util.SkipProgressMessage
      • sphinx.util.progress_message

      Moved to sphinx.util.http_date:

      • sphinx.util.epoch_to_rfc1123
      • sphinx.util.rfc1123_to_epoch

      Moved to sphinx.util.exceptions:

      • sphinx.util.save_traceback

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 0
  • Add convenience method to set default audio and subtitle streams

    Add convenience method to set default audio and subtitle streams

    Description

    • Auto-reload when accessing Video.audioStreams() and Video.subtitleStreams().
    • Add a convenience methods to set audio streams or subtitle streams as default.
    # Simplified video.media[0].parts[0].setDefaultAudioStream(video.audioStreams()[0])
    video.audioStreams()[0].setDefault()
    
    # Simplified video.media[0].parts[0].setDefaultSubtitleStream(video.subtitleStreams()[0])
    video.subtitleStreams()[0].setDefault()
    

    Type of change

    Please delete options that are not relevant.

    • [x] New feature (non-breaking change which adds functionality)
    • [x] This change requires a documentation update

    Checklist:

    • [x] My code follows the style guidelines of this project
    • [x] I have performed a self-review of my own code
    • [ ] I have commented my code, particularly in hard-to-understand areas
    • [x] I have added or updated the docstring for new or existing methods
    • [x] I have added tests when applicable
    non-breaking 
    opened by JonnyWong16 0
  • Add options to history

    Add options to history

    Description

    Add optional choices to history filter

    Fixes # (issue)

    Type of change

    Please delete options that are not relevant.

    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] This change requires a documentation update

    Checklist:

    • [ ] My code follows the style guidelines of this project
    • [ ] I have performed a self-review of my own code
    • [ ] I have commented my code, particularly in hard-to-understand areas
    • [ ] I have added or updated the docstring for new or existing methods
    • [ ] I have added tests when applicable
    opened by dmintz7 1
  • Bump pillow from 9.3.0 to 9.4.0

    Bump pillow from 9.3.0 to 9.4.0

    Bumps pillow from 9.3.0 to 9.4.0.

    Release notes

    Sourced from pillow's releases.

    9.4.0

    https://pillow.readthedocs.io/en/stable/releasenotes/9.4.0.html

    Changes

    ... (truncated)

    Changelog

    Sourced from pillow's changelog.

    9.4.0 (2023-01-02)

    • Fixed null pointer dereference crash with malformed font #6846 [wiredfool, radarhere]

    • Return from ImagingFill early if image has a zero dimension #6842 [radarhere]

    • Reversed deprecations for Image constants, except for duplicate Resampling attributes #6830 [radarhere]

    • Improve exception traceback readability #6836 [hugovk, radarhere]

    • Do not attempt to read IFD1 if absent #6840 [radarhere]

    • Fixed writing int as ASCII tag #6800 [radarhere]

    • If available, use wl-paste or xclip for grabclipboard() on Linux #6783 [radarhere]

    • Added signed option when saving JPEG2000 images #6709 [radarhere]

    • Patch OpenJPEG to include ARM64 fix #6718 [radarhere]

    • Added support for I;16 modes in putdata() #6825 [radarhere]

    • Added conversion from RGBa to RGB #6708 [radarhere]

    • Added DDS support for uncompressed L and LA images #6820 [radarhere, REDxEYE]

    • Added LightSource tag values to ExifTags #6749 [radarhere]

    • Fixed PyAccess after changing ICO size #6821 [radarhere]

    • Do not use EXIF from info when saving PNG images #6819 [radarhere]

    • Fixed saving EXIF data to MPO #6817 [radarhere]

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 0
  • Bump actions/cache from 3.0.11 to 3.2.2

    Bump actions/cache from 3.0.11 to 3.2.2

    Bumps actions/cache from 3.0.11 to 3.2.2.

    Release notes

    Sourced from actions/cache's releases.

    v3.2.2

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/cache/compare/v3.2.1...v3.2.2

    v3.2.1

    What's Changed

    Full Changelog: https://github.com/actions/cache/compare/v3.2.0...v3.2.1

    v3.2.0

    What's Changed

    New Contributors

    ... (truncated)

    Changelog

    Sourced from actions/cache's changelog.

    3.0.11

    • Update toolkit version to 3.0.5 to include @actions/core@^1.10.0
    • Update @actions/cache to use updated saveState and setOutput functions from @actions/core@^1.10.0

    3.1.0-beta.1

    • Update @actions/cache on windows to use gnu tar and zstd by default and fallback to bsdtar and zstd if gnu tar is not available. (issue)

    3.1.0-beta.2

    • Added support for fallback to gzip to restore old caches on windows.

    3.1.0-beta.3

    • Bug fixes for bsdtar fallback if gnutar not available and gzip fallback if cache saved using old cache action on windows.

    3.2.0-beta.1

    • Added two new actions - restore and save for granular control on cache.

    3.2.0

    • Released the two new actions - restore and save for granular control on cache

    3.2.1

    • Update @actions/cache on windows to use gnu tar and zstd by default and fallback to bsdtar and zstd if gnu tar is not available. (issue)
    • Added support for fallback to gzip to restore old caches on windows.
    • Added logs for cache version in case of a cache miss.

    3.2.2

    • Reverted the changes made in 3.2.1 to use gnu tar and zstd by default on windows.
    Commits
    • 4723a57 Revert compression changes related to windows but keep version logging (#1049)
    • d1507cc Merge pull request #1042 from me-and/correct-readme-re-windows
    • 3337563 Merge branch 'main' into correct-readme-re-windows
    • 60c7666 save/README.md: Fix typo in example (#1040)
    • b053f2b Fix formatting error in restore/README.md (#1044)
    • 501277c README.md: remove outdated Windows cache tip link
    • c1a5de8 Upgrade codeql to v2 (#1023)
    • 9b0be58 Release compression related changes for windows (#1039)
    • c17f4bf GA for granular cache (#1035)
    • ac25611 docs: fix an invalid link in workarounds.md (#929)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies github_actions 
    opened by dependabot[bot] 0
  • Cleanup duplicate header.platform reading

    Cleanup duplicate header.platform reading

    Description

    It was originally a typo fallback for header.platorm before 3917b335c. See also f26db5de.

    Type of change

    Please delete options that are not relevant.

    • [x] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
    • [ ] This change requires a documentation update

    Checklist:

    • [ ] My code follows the style guidelines of this project
    • [x] I have performed a self-review of my own code
    • [ ] I have commented my code, particularly in hard-to-understand areas
    • [ ] I have added or updated the docstring for new or existing methods
    • [ ] I have added tests when applicable
    non-breaking 
    opened by glensc 0
Releases(4.13.2)
  • 4.13.2(Dec 21, 2022)

    Bug Fixes

    #1057 - Fix parsing settings enum #1068 - Fix getGuid doc string #1069 - Fix: Inherit session when creating internal PlexServer objects #1073 - Fix: Remove bogus space from searchDiscover limit parameter #1075 - Fix parsing requirements in setup.py

    New Features

    #1039 - Add timeout parameter to uploadTheme #1055 - Create music playlist from m3u file #1059 - Add Rating media tag #1063 - Add 2FA code parameter for MyPlexAccount #1071 - Allow overriding includeUserState for _toOnlineMetadata #1076 - Add pin parameter to switchHomeUser

    Improvements

    #1058 - Factor out playQueue() method to PlexPartialObject #1065 - Use cached_property decorator #1070 - Performance: Use totalSize attribute for watchlist walking #1074 - Properly close file object in mixin uploads

    Source code(tar.gz)
    Source code(zip)
  • 4.13.1(Nov 9, 2022)

    Bug Fixes

    #1019 - Add container size to seasons request to allow more than 20 to be pulled #1024 - Fix library guid search #1027 - Fix initializing metadata.provider.plex.tv multiple times #1046 - Client timeline "repeat" should be int and not a boolean

    New Features

    #1044 - Add methods to change Plex Home PIN

    Improvements

    #1028 - Remove sync tests from CI #1025 - More f-string changes #1041 - Fix typo in acceptInvite doc string #1052 - Fix MyPlexAccount.removePin() test #1053 - Patch deprecated set-output in CI workflow


    Thanks to new contributor @richardgetz, @SebastianLuebke, and @mikewebkist.

    Source code(tar.gz)
    Source code(zip)
  • 4.13.0(Aug 28, 2022)

    Bug Fixes

    #1013 - Fix searchDiscover handling invalid results

    New Features

    #785 - Add ManagedHub Object and methods #983 - Add ability to toggle account view state syncing #984 - Add PlayedUnplayedMixin #986 - Add return self to various methods to support chaining #994 - Add support for using MediaTag objects when editing tags #998 - Add utils.toJson(obj) function to convert an object to a JSON string #1009 - Add maxresults parameter to MyPlexAccount.watchlist() #1010 - Add edition support for movies

    Improvements

    #990 - Use pagination for /all endpoints #1000 - Update PlexAPI to f-strings #1011 - Add workflow dispatch to CI workflow #1016 - Ensure watchlist is cleared before tests


    Thanks to new contributor @josh.

    Source code(tar.gz)
    Source code(zip)
  • 4.12.1(Aug 6, 2022)

    Bug Fixes

    #992 - Fix resource mixins to use ratingKey instead of key (Fixes Playlist.uploadPoster())

    Improvements

    #985 - Expose callbackError parameter in PlexServer.startAlertListener() #987, #1005 - Remove unused timeout parameter from preferred_connections doc string #993 - Update search operator docs


    Thanks to new contributor @rcarmo.

    Source code(tar.gz)
    Source code(zip)
  • 4.12.0(Jul 21, 2022)

    Breaking Changes

    #931 - Create separate PlexSession objects #963 - Remove Python 3.6 support #965 - Fix Video.optimize() method

    New Features

    #958 - Add method to switch Plex Home users #959 - Add MediaPartStream.languageTag attribute #968 - Add guids attribute to Artist, Album, and Track #974 - Add support for Plex OAuth

    Bug Fixes

    #970 - Fix searching and browsing Discover results #977 - Remove check for playQueueType when adding items to a PlayQueue #981 - Fix Artists.matches() when searching by title

    Improvements

    #955 - Define ratingCount attribute in doc #978 - Use /related endpoint for hubs #982 - Use fetchItem for MyPlexAccount.userState()


    Thanks to new contributor @MattMcDowall.

    Source code(tar.gz)
    Source code(zip)
  • 4.11.2(May 30, 2022)

    Bug Fixes

    #946 - Make sure PlexObject private attributes are set before loading data

    Improvements

    #943 - Remove extending from (object), not needed in Python 3 #950 - Minor improvements to fetching season/show

    Source code(tar.gz)
    Source code(zip)
  • 4.11.1(May 19, 2022)

  • 4.11.0(May 18, 2022)

    New Features

    #916 - Add method to manually run butler tasks #918 - Get album track by track number without keyword argument #922 - Add support for watchlists and streaming services #926 - Add support for Plex guid in LibrarySection.getGuid() #935 - Allow disabling auto-reloading when accessing missing attributes

    Bug Fixes

    #912 - Use breadth-first search when using rtag #933 - Fix PlexServer.isBrowsable(path) when running Plex API on a different OS #937 - Fix searching a library for collections by label

    Improvements

    #913 - Set daemon attribute instead of using setDaemon method #927 - Fix movie tagline test #938 - Fix episode writers test #939 - Fix typos


    Thanks to new contributors @kianmeng and @tirkarthi.

    Source code(tar.gz)
    Source code(zip)
  • 4.10.1(Mar 17, 2022)

    New Features

    • #905: Enable external media in responses, e.g. Tidal
    • #908: Allow exclusion keys in sharing settings

    Bug Fixes:

    • #898: Fix test track ratingCount attribute
    • #904: show_secrets always False (docs)
    • #907: Fix playMedia and goToMedia when using a different PMS

    Thanks to new contributors @kkatayama and @zacwest!

    Source code(tar.gz)
    Source code(zip)
  • 4.10.0(Feb 27, 2022)

    Breaking Changes

    • #875 - Refactor and cleanup tag editing methods

    New Features

    • #872 - Add labels support to Season, Episode, Artist, and Track objects
    • #876 - Add new methods to edit object fields
    • #879 - Add themes support
    • #890 - Add extras and hubs mixins
    • #891 - Add Video.audioStreams() convenience method
    • #894 - Add support for collection "filtering based on user" advanced setting

    Bug Fixes

    • #888 - Ignore whitespace in library section lookup
    • #893 - Add missing Track.skipCount attribute
    • #896 - Fix Artist.album() to return special albums

    Improvements

    • #880 - Fix various typos
    • #885 - Add librarySectionID when using fetchItem
    • #889 - Fix language in library tests
    • #897 - Add tests for theme mixin
    Source code(tar.gz)
    Source code(zip)
  • 4.9.2(Feb 7, 2022)

  • 4.9.1(Jan 24, 2022)

  • 4.9.0(Jan 24, 2022)

    Breaking Changes

    • #871 - Change MusicSection.stations() to return a list of Playlist objects

    New Features

    • #837 - Add methods to add and remove folders in a library
    • #861 - Add methods to lock and unlock a field for all items in a library
    • #870 - Add support for Artist radio stations
    • #873 - Add method to return global hubs

    Bug Fixes

    • #864 - Fix parsing Agent object settings

    Improvements

    • #862 - Improve the library getGuid() method to be faster
    Source code(tar.gz)
    Source code(zip)
  • 4.8.0(Nov 21, 2021)

    Breaking Changes

    • #845 - Update server transcodeImage method
    • #855 - Change LibrarySection.reload() to reload in-place

    New Features

    • #849 - Add methods for accepting and cancelling friend invites
    • #851 - Add totalDuration and totalStorage properties to LibrarySection
    • #850 - Add support for error callback for AlertListener

    Bug Fixes

    • #847 - Cleanup download methods
    • #848 - Fix media delete

    Improvements

    • #839 - Update bug report template to issues form
    • #856 - Fix image mixins tests
    Source code(tar.gz)
    Source code(zip)
  • 4.7.2(Oct 4, 2021)

    New Features

    • #810 - Add methods to retrieve the Plex Web URL
    • #831 - Automatically retrieve external guids from libraries using includeGuids
    • #832 -Add album formats and subformats
    Source code(tar.gz)
    Source code(zip)
  • 4.7.1(Sep 13, 2021)

    New Features

    • #814 - Add attribute for Sonic Analysis
    • #825 - Add methods to lock and unlock artwork and posters

    Bug Fixes

    • #826 - Fix PMS timeline reporting on clients when using playMedia
    Source code(tar.gz)
    Source code(zip)
  • 4.7.0(Jul 27, 2021)

    Breaking Changes

    • Python 3.5 is now deprecated (see #804)
    • Arguments have been added to the LibrarySection.playlists(), Playlist._createSmart(), PlexServer.playlists(), and PlexServer.createPlaylist()calls (see #782 and #799)

    New Features

    • #782 - Add playlist title search and sorting
    • #799 - Add libtype argument for creating smart playlists
    Source code(tar.gz)
    Source code(zip)
  • 4.6.3(Jul 27, 2021)

    New Features

    • #781 - Add ability to parse the smart filters from collections and playlists
    • #783 - Add ability to move items in a collection
    • #797 - Add producers, roles, and hasCommercialMarker to Episode objects
    • #800 - Decouple resource address sorting from connection attempts

    Bug Fixes

    • #798 - Fix sync headers and add default subtitle size

    Improvements

    • #780 - Remove manual sorts/fields added to PMS
    • #788 - Add ability to use FilterChoice and FilteringSort objects in library search
    Source code(tar.gz)
    Source code(zip)
  • 4.6.1(Jun 16, 2021)

    Bug Fixes

    • #773 - Fix return value when using USER_DONT_RELOAD_FOR_KEYS
    • #775 - Fix playlist copyToUser()
    • #778 - Fix creating MyPlexAccount() for a non-Plex Pass account
    Source code(tar.gz)
    Source code(zip)
  • 4.6.0(Jun 7, 2021)

    New Features

    • #530 - Add movie reviews and extras, and account online media sources options
    • #729 - Add new Collection attributes for smart collections
      • Adds collections attribute for Season, Episode, and Track
      • plexapi.collection.Collections renamed to plexapi.collection.Collection
    • #739 - Add method to return a list of all optimized items
    • #741 - Add ability to retrieve a list of items and collection object from media tags
    • #746 - Add episodeNumber, trackNumber, and hasPreviewThumbnails helper properties
    • #749 - Add method to switch users for a PlexServer instance
    • #750 - Add multi-sort, advanced filters, and additional sort/filter fields to library search
    • #751 - Add library recently added methods for each libtype
    • #758 - Add method to claim and unclaim server
    • #763 - Fix smart playlists and add support for smart collections
    • #764 - Add rating mixin

    Bug Fixes

    • #720 - Fix editing advanced settings without integer values
    • #723 - Fix typo in SERVER_TRANSCODE_SESSIONS mock test
    • #725 - Fix retrieving Show.season(0) (specials) for tv shows
    • #727 - Fix typo in library search error log message
    • #730 - Fix retrieving Season.episode() by episode number
    • #756 - Allow overwriting attributes with None when manually reloading

    Improvements

    • #742 - Update tests to the new Plex TV Series agent
    • #745 - Limit datetime attributes to max 32-bit integer timestamp
    • #766 - Fix show mixin image test
    • #760 - Cleanup usage of base PlexObject methods
    • Update dev dependencies
    Source code(tar.gz)
    Source code(zip)
  • 4.5.2(Apr 5, 2021)

    New Features

    • #717 - Allow relative dates for search filters

    Bug Fixes

    • #715 - Fix LibrarySection totalViewSize for photo libraries

    Improvements

    • #714 - Added AdvancedSettingsMixin
    Source code(tar.gz)
    Source code(zip)
  • 4.5.1(Mar 25, 2021)

  • 4.5.0(Mar 22, 2021)

    Breaking Changes

    • Library search has been completely rewritten. See docs for complete details and examples. (#693)
      • Deprecated: LibrarySection.filterFields() and LibrarySection.listChoices()
      • LibrarySection.filters is cast to a bool instead of a str
      • LibrarySection.key is cast to an int instead of a str
      • librarySectionID is cast to an int instead of a str

    New Features

    • #693 - Fix and update library searching
    • #703 - Add clientIdentifier attribute to SystemDevice
    • #701 - Improve PlexClient connections
    • #704 - Add deviceID to Playable for history entries

    Bug Fixes

    • #699 - Fix parsing episode parentRatingKey from parentThumb
    • #708 - Fix myplex share section ID cast to int
    • #709 - Fix photos sync test

    Improvements

    • #702 - Fix PR template location
    • #705 - bugreport: fix snippets typo
    Source code(tar.gz)
    Source code(zip)
  • 4.4.1(Mar 11, 2021)

    New Features

    • #674 - Add tagline attribute to show
    • #679 - Add support for the new Plex TV agent
    • #680 - Adds Movie and Artist advanced setting attributes

    Bug Fixes

    • #678 - Fix season watched/unwatched
    • #692 - Handle missing key when PlayQueue passed to playMedia

    Improvements

    • #673 - Update sharing doc strings
    • #676 - Add mixins and collection modules to documentation
    Source code(tar.gz)
    Source code(zip)
  • 4.4.0(Feb 24, 2021)

    Breaking Changes

    • Poster.selected is casted to a bool instead of being a str (#648)
    • Photo.tags is now plural tags instead of tag (#649)

    New Features

    • #649 - Add more tag editing methods and move to a mixin
    • #664 - Add originalTitle attribute to show

    Bug Fixes

    • #656 - Fix checking object parent when the weakref is dead
    • #657 - Fix episode parentKey and parentRatingKey when seasons are hidden in Plex
    • #662 - Fix bug preventing overwriting attrs with a blank list
    • #668 - Fix gdm.GDM.find_by_content_type()
    • #669 - Fix deprecation warnings

    Improvements

    • #639 - Move split/merge and unmatch/match to a mixin
    • #648 - Update poster and art and move to a mixin
    • #659 - Don't refresh metadata after editing tags
    • #665 - Add banner mixin to shows and clean up art/poster mixins
    • #666 - Rename server checkForUpdate
    • #667 - Move collections to a separate module
    • #670 - fix: code quality issues
    Source code(tar.gz)
    Source code(zip)
  • 4.3.1(Feb 2, 2021)

    New Features

    • #651 - Add thumbUrl and artUrl properties to Collections

    Bug Fixes

    • #650 - Fix photo album key
    • #652 - Fix session param in tests

    Improvements

    • #634 - Use common session and increase Plex account timeout in tests
    • #653 - Fix sorting of resource connections
    Source code(tar.gz)
    Source code(zip)
  • 4.3.0(Jan 25, 2021)

    Breaking Changes

    • Several media attribute and method changes (See #590 and #630)
    • Sorting when using LibrarySection.all('title:asc') now requires the sort keyword argument (e.g. LibrarySection.all(sort='title:asc')). (See #631)
    • MyPlexAccount.id now casted to int (See #636)

    New Features

    • #597 - Add method to retrieve a PlayQueue
    • #601 - Add ability to browse and walk the Plex server system file directories
    • #604 - Add library update path parameter
    • #607 - Add ability to customize XML includes when reloading object
    • #619 - Add method to keep track of the parent PlexObject as children are built
    • #628 - Add support for the new Plex Movie agent
    • #629 - Added missing support for /transcode/sessions
    • #630 - Update media type attributes
    • #636 - Add Plex dashboard bandwidth and resources

    Bug Fixes

    • #584 - Cancel Invite Fix
    • #606 - Fix Collections stuck as partial object after reloading
    • #616 - Fix collection children
    • #626 - Clean up transcode image test
    • #641 - Fix onDeck handling of TV Shows
    • #642 - Fix related hubs
    • #643 - Fix server hub searches

    Improvements

    • #535 - Playlist creation - check items are included, raise exception
    • #590 - Update to MediaPartStream and inheriting classes
    • #617 - Change LibrarySection collections method to plural and add playlists method
    • #631 - Update LibrarySection.all() for more filtering/sorting and faster results
    • #647 - Reduce log level of MyPlex resource connection attempts

    Github Action CI migration

    • #443 - Github action to publish to PyPI
    • #602 - Use Github Actions as CI
    • #608 - Update building documentation using napoleon
    • #610 - Allow setting token env in tests
    • #611 - Remove playlist created during tests
    • #612 - Github Actions followup
    • #613 - Explicitly trigger Actions on master branch
    • #614 - Fix country metadata test
    • #615 - Add codecov configuration
    • #618 - Disable media scanning jobs in bootstrap
    • #620 - Fix sync tests when using a token
    • #625 - Fix race condition in create MyPlexDevice from #620
    • #627 - Fix disable settings for bootstrap test server
    Source code(tar.gz)
    Source code(zip)
  • 4.2.0(Nov 1, 2020)

    Breaking changes

    PlexClient.timeline() previously returned a raw XML object. Now returns a newly available ClientTimeline instance for the current active session. See #572.

    New Features

    • #507 - Edit Library and Show's Advanced Settings
    • #518 - Library Hubs and Music Stations
    • #582 - Add download feature to Photo library
    • #572 - Update timeline to return an active timeline object w/ attributes
    • #585 - Allow scanning for clients when using GDM.all()
    • #592 - Make Photo objects Playable

    Bug fixes

    • #580 - Add server handling of HTTP status code 204
    • #581 - Handle empty datetimes in tests
    • #583 - Updating cleanBundles() and optimize() methods
    • #588 - Collection fields not pulling locked fields
    • #594 - Don't overwrite existing attributes with an empty list
    Source code(tar.gz)
    Source code(zip)
  • 4.1.2(Sep 28, 2020)

  • 4.1.1(Sep 21, 2020)

Owner
Michael Shepanski
Michael Shepanski
Low-level Python CFFI Bindings for Argon2

Low-level Python CFFI Bindings for Argon2 argon2-cffi-bindings provides low-level CFFI bindings to the Argon2 password hashing algorithm including a v

Hynek Schlawack 4 Dec 15, 2022
Python bindings for `ign-msgs` and `ign-transport`

Python Ignition This project aims to provide Python bindings for ignition-msgs and ignition-transport. It is a work in progress... C++ and Python libr

Rhys Mainwaring 3 Nov 8, 2022
Python bindings for Basler's VisualApplets TCL script generation

About visualapplets.py The Basler AG company provides a TCL scripting engine to automatize the creation of VisualApplets designs (a former Silicon Sof

Jürgen Hock 2 Dec 7, 2022
High-level bindings to the Valhalla framework.

Valhalla for Python This spin-off project simply offers improved Python bindings to the fantastic Valhalla project. Installation pip install valhalla

GIS • OPS 20 Dec 13, 2022
Url-check-migration-python - A python script using Apica API's to migrate URL checks between environments

url-check-migration-python A python script using Apica API's to migrate URL chec

Angelo Aquino 1 Feb 16, 2022
Driving lessons made simpler. Custom scheduling API built with Python.

NOTE This is a mirror of a GitLab repository. Dryvo Dryvo is a unique solution for the driving lessons industry. Our aim is to save the teacher’s time

Adam Goldschmidt 595 Dec 5, 2022
Simple Python API for the Ergo Platform Explorer

Ergo is a "Resilient Platform for Contractual Money." It is designed to be a platform for applications with the main focus to provide an efficient, se

null 7 Jul 6, 2021
An unofficial python API for trading on the DeGiro platform, with the ability to get real time data and historical data.

DegiroAPI An unofficial API for the trading platform Degiro written in Python with the ability to get real time data and historical data for products.

Jorrick Sleijster 5 Dec 16, 2022
OpenSea NFT API App using Python and Streamlit

opensea-nft-api-tutorial OpenSea NFT API App using Python and Streamlit Tutorial Video Walkthrough https://www.youtube.com/watch?v=49SupvcFC1M Instruc

null 64 Oct 28, 2022
Algorand Python API examples

Algorand-Py Algorand Python API examples This repo will hold example scripts to monitor activities on Algorand main net. You can: Monitor your assets

Karthik Dutt 2 Jan 23, 2022
A Python wrapper for Matrix Synapse admin API

Synapse-admin-api-python A Python wrapper for Matrix Synapse admin API. Versioning This library now supports up to Synapse 1.45.0, any Admin API intro

Knugi 9 Sep 28, 2022
A python API act as Control Center to control your Clevo Laptop via wmi on windows.

ClevoPyControlCenter A python API act as Control Center to control your Clevo Laptop via wmi on windows. Usage # pip3 install pymi from clevo_wmi impo

null 3 Sep 19, 2022
Simple and easy to use python API for the COVID registration booking system of the math department @ unipd (torre archimede)

Simple and easy to use python API for the COVID registration booking system of the math department @ unipd (torre archimede). This API creates an interface with the official browser, with more useful functionalities.

Guglielmo Camporese 4 Dec 24, 2021
A PG3D API Made with Python

PG3D Python API A Pixel Gun 3D Python API (Public Ver) Features Count: 29 How To Use? import api as pbn Examples pbn.isBanned(192819483) -> True pbn.f

Karim 2 Mar 24, 2022
A(Sync) Interface for internal Audible API written in pure Python.

Audible Audible is a Python low-level interface to communicate with the non-publicly Audible API. It enables Python developers to create there own Aud

mkb79 192 Jan 3, 2023
An async API wrapper for Dress To Impress written in Python.

dti.py An async API wrapper for Dress To Impress written in Python. Some notes: For the time being, there are no front-facing docs for this beyond doc

Steve C 1 Dec 14, 2022
A pet facts python api

Pet-Facts-API A pet facts python api Project Links API :- https://pet-facts-api.vercel.app Docs :- https://fayasnoushad.github.io/Pet-Facts-API

Fayas Noushad 3 Dec 18, 2021
Python program that generates random user from API

RandomUserPy Author kirito sate #modules used requests, json, tkinter, PIL, urllib, io, install requests and PIL modules from pypi pip install Pillow

kiritosate 1 Jan 5, 2022
A Python wrapper API for operating and working with the Neo4j Graph Data Science (GDS) library

gdsclient NOTE: This is a work in progress and many GDS features are known to be missing or not working properly. This repo hosts the sources for gdsc

Neo4j 100 Dec 20, 2022