Metadata-Version: 2.4
Name: playdirector
Version: 0.4.0
Summary: Maintained headless-capable PlayStation Remote Play client
Author: ktnrg45 and contributors
Maintainer: Jack Powell
License-Expression: GPL-3.0-only
Project-URL: Homepage, https://github.com/JackJPowell/playdirector
Project-URL: Upstream, https://github.com/ktnrg45/pyremoteplay
Classifier: Development Status :: 4 - Beta
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Topic :: Home Automation
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: aiohttp<4,>=3.9
Requires-Dist: async-timeout<6,>=4
Requires-Dist: pyps4-2ndscreen<2,>=1.2.1
Requires-Dist: cryptography>=41
Requires-Dist: pycryptodomex>=3.20
Requires-Dist: protobuf<7,>=4.21.1
Requires-Dist: requests<3,>=2.31
Requires-Dist: pyee<13,>=12
Requires-Dist: pyyaml<7,>=6
Requires-Dist: netifaces>=0.11
Provides-Extra: gui
Requires-Dist: pyside6>=6.2; extra == "gui"
Requires-Dist: av>=12; extra == "gui"
Requires-Dist: PyOpenGL>=3.1.5; extra == "gui"
Requires-Dist: sounddevice>=0.4.4; extra == "gui"
Requires-Dist: pyjerasure>=1.0; extra == "gui"
Requires-Dist: pygame>=2.1; extra == "gui"
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"
Requires-Dist: pytest-asyncio>=0.24; extra == "dev"
Requires-Dist: build>=1.2; extra == "dev"
Requires-Dist: twine>=6; extra == "dev"
Requires-Dist: ruff>=0.9; extra == "dev"
Provides-Extra: fec
Requires-Dist: pyjerasure>=1.0; extra == "fec"
Dynamic: license-file

# playdirector 0.4 — maintained Remote Play engine

Local PS4/PS5 control with a headless-first API, based on pyremoteplay.

```python
from playdirector import ConsoleController, pair_console

credentials = await pair_console("192.168.1.50", "123456789", "12345678")
# Persist credentials using your application configuration storage.
controller = ConsoleController(credentials)
try:
    await controller.wake()
    # Wait until controller.status() reports status-code 200 before input.
    await controller.button("CROSS")
    await controller.go_home()
finally:
    await controller.close()
```

Install `playdirector`, not the separate `pyremoteplay` distribution. Importing
`playdirector` uses the included `pyremoteplay` protocol engine. No GUI or media
receiver is needed. Pairing accepts a decimal or Base64 PSN account ID and console
PIN; cloud NPSSO authentication is owned by your application.

**0.4 changes the public API and adopts the upstream GPL-3.0-only license.**
See [PUBLISHING.md](PUBLISHING.md) for migration, provenance, tests and publication.

The upstream documentation below describes the engine API and optional GUI.

---

# pyremoteplay #
[![PyPi](https://img.shields.io/pypi/v/playdirector.svg)](https://pypi.org/project/playdirector/)
[![Build Status](https://github.com/JackJPowell/playdirector/actions/workflows/build.yml/badge.svg)](https://github.com/JackJPowell/playdirector/actions/workflows/build.yml)
[![Documentation Status](https://readthedocs.org/projects/pyremoteplay/badge/?version=latest)](https://pyremoteplay.readthedocs.io/en/latest/?badge=latest)

Python PlayStation Remote Play API

[Documentation](https://pyremoteplay.readthedocs.io/en/latest)

## About ##
This project provides an API to programmatically connect to and control Remote Play hosts (PS4 and PS5). The low-level networking internals is written using the Asyncio framework. In addition it includes an optional GUI, allowing to view the live stream and control the host through keyboard/mouse input. This library is based on the C/C++ project [Chiaki](https://github.com/thestr4ng3r/chiaki).

## Features ##
- API to programatically control host and expose live audio/video stream
- Registering client for Remote Play on the host 
- Interface for controlling the host, which emulates a DualShock controller
- Ability to power off/on the host if standby is enabled
- GUI which displays the live stream and supports keyboard/mouse input
- Support for controllers

## Requirements ##
- Python 3.11+
- OS: Linux, Windows 10

- Note: Untested on MacOS

## Network Requirements ##
This project will only work with local devices; devices on the same local network.
You may be able to connect with devices on different subnets, but this is not guaranteed.

## GUI Dependencies ##
The GUI requires dependencies that may be complex to install.
Below is a list of such dependencies.
- pyav (May require FFMPEG to be installed)
- PySide6

`uvloop` is supported for the GUI and will be used if installed.

## Installation ##
It is recommended to install in a virtual environment.

```
  python3 -m venv .
  source bin/activate
```

### From pip ###
To install core package run:
```
pip install playdirector
```

To install with optional GUI run:
```
pip install playdirector[gui]
```

### From Source ###
To Install from source, clone this repo and navigate to the top level directory.

```
  pip install -r requirements.txt
  python setup.py install
```

To Install GUI dependencies run:
```
  pip install -r requirements-gui.txt
```

## Setup ##
There are some steps that must be completed to use this library from a user standpoint.
- Registering a PSN Account
- Linking PSN Account and client to the Remote Play Host

Configuration files are saved in the `.pyremoteplay` folder in the users home directory. Both the CLI and GUI utilize the same files.

### CLI Setup ###
Registering and linking can be completed through the cli by following the prompts after using the below command:

`pyremoteplay {host IP Address} --register`

Replace `{host IP Address}` with the IP Address of the Remote Play host.

### GUI Setup ###
Registering and linking can be performed in the options screen.

## Usage ##
To run the terminal only CLI use the following command:
`pyremoteplay {host IP Address}`

To run the GUI use the following command:
`pyremoteplay-gui`

## Notes ##
- Video decoding is performed by the CPU by default. Hardware Decoding can be enabled in the options screen in the GUI.
- You may have to install `ffmpeg` with hardware decoding enabled and then install `pyav` with the following command to allow for hardware decoding:
`pip install av --no-binary av`


## Baseline measurements ##
The CLI instance runs at 5-10% CPU usage with around 50Mb memory usage according to `top` on this author's machine: ODroid N2.

## Known Issues/To Do ##
- Text sending functions
- Add support for HDR
- Audio stutters
