2023-12-08 01:57:30 +00:00
# Plex Preroll Scheduler
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
A script to automate management of Plex pre-rolls.
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
Define when you want different pre-rolls to play throughout the year. For example:
2021-01-01 18:51:22 +00:00
- Holiday pre-roll rotations
- Special occasions
2023-12-08 01:57:30 +00:00
- Seasonal rotations
2021-01-01 18:51:22 +00:00
- Breaking up the monotony
2021-01-01 20:09:54 +00:00
- Keeping your family on their toes!
2021-01-01 18:51:22 +00:00
2021-01-01 20:09:54 +00:00
---
2023-12-08 01:57:30 +00:00
## Installation and Usage
2021-01-01 20:09:54 +00:00
2023-12-08 01:57:30 +00:00
### Run Script Directly
2021-01-01 20:09:54 +00:00
2023-12-08 01:57:30 +00:00
#### Requirements
2021-01-01 20:09:54 +00:00
2023-12-08 01:57:30 +00:00
- Python 3.8+
2021-01-01 20:09:54 +00:00
2023-12-08 01:57:30 +00:00
Clone the repo:
2021-01-01 18:51:22 +00:00
```sh
2023-12-08 01:57:30 +00:00
git clone https://github.com/nwithan8/plex-schedule-prerolls.git
2021-01-01 18:51:22 +00:00
```
2023-12-08 01:57:30 +00:00
Install Python requirements:
2021-01-01 18:51:22 +00:00
```sh
pip install -r requirements.txt
```
2023-12-08 01:57:30 +00:00
Copy `config.ini.sample` to `config.ini` and complete the `[auth]` section with your Plex server information.
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
Copy `schedules.yaml.sample` to `schedules.yaml` and [edit your schedule ](#schedule-rules ).
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
Run the script:
2021-01-01 18:51:22 +00:00
```sh
python schedule_preroll.py
```
2023-12-08 01:57:30 +00:00
#### Advanced Usage
2021-01-01 18:51:22 +00:00
```sh
2023-12-08 01:57:30 +00:00
$ python schedule_preroll.py -h
2021-01-01 18:51:22 +00:00
usage: schedule_preroll.py [-h] [-v] [-l LOG_CONFIG_FILE] [-c CONFIG_FILE] [-s SCHEDULE_FILE]
Automate scheduling of pre-roll intros for Plex
optional arguments:
-h, --help show this help message and exit
-v, --version show the version number and exit
2021-01-07 03:33:14 +00:00
-lc LOG_CONFIG_FILE, --logconfig-path LOG_CONFIG_FILE
2021-01-01 18:51:22 +00:00
Path to logging config file. [Default: ./logging.conf]
-c CONFIG_FILE, --config-path CONFIG_FILE
Path to Config.ini to use for Plex Server info. [Default: ./config.ini]
-s SCHEDULE_FILE, --schedule-path SCHEDULE_FILE
2023-12-08 01:57:30 +00:00
Path to pre-roll schedule file (YAML) to be use. [Default: ./schedules.yaml]
2021-01-01 18:51:22 +00:00
```
2023-12-08 01:57:30 +00:00
##### Example
2021-01-01 18:51:22 +00:00
```sh
python schedule_preroll.py \
-c path/to/custom/config.ini \
2023-12-08 01:57:30 +00:00
-s path/to/custom/schedules.yaml \
2021-01-07 03:33:14 +00:00
-lc path/to/custom/logger.conf
2021-01-01 18:51:22 +00:00
```
2023-12-08 01:57:30 +00:00
### Run as Docker Container
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
#### Requirements
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
- Docker
#### Docker Compose
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
Complete the provided `docker-compose.yml` file and run:
2021-01-01 18:51:22 +00:00
```sh
2023-12-08 01:57:30 +00:00
docker-compose up -d
2021-01-01 18:51:22 +00:00
```
2023-12-08 01:57:30 +00:00
#### Docker CLI
2021-01-01 18:51:22 +00:00
```sh
2023-12-08 01:57:30 +00:00
docker run -d \
--name=plex_prerolls \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e CRON_SCHEDULE="0 0 * * *" \
-v /path/to/config:/config \
-v /path/to/logs:/logs \
--restart unless-stopped \
nwithan8/plex_prerolls:latest
2021-01-01 18:51:22 +00:00
```
2023-12-08 01:57:30 +00:00
#### Paths and Environment Variables
2021-01-01 18:51:22 +00:00
2023-12-08 07:50:19 +00:00
| Path | Description |
|-----------|--------------------------------------------------------------------------------------|
| `/config` | Path to config files (`config.ini` and `schedules.yaml` should be in this directory) |
| `/logs` | Path to log files (`schedule_preroll.log` will be in this directory) |
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
| Environment Variable | Description |
|----------------------|-------------------------------------------------------------------|
| `PUID` | UID of user to run as |
| `PGID` | GID of user to run as |
| `TZ` | Timezone to use for cron schedule |
| `CRON_SCHEDULE` | Cron schedule to run script (see < https: // crontab . guru > for help) |
2021-01-21 02:53:50 +00:00
---
2023-12-08 01:57:30 +00:00
## Schedule Rules
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
Schedules follow the following priority:
1. **misc** : Items listed in `always_use` will always be included (appended) to the preroll list
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
2. **date_range** : Schedule based on a specific date/time range
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
3. **weekly** : Schedule based on a specific week of the year
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
4. **monthly** : Schedule based on a specific month of the year
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
5. **default** : Default item to use if none of the above apply
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
For any conflicting schedules, the script tries to find the closest matching range and highest priority.
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
### Advanced Scheduling
#### Date Range Section Scheduling
`date_range` entries can accept both dates (`yyyy-mm-dd`) and datetimes (`yyyy-mm-dd hh:mm:ss`, 24-hour time).
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
`date_range` entries can also accept wildcards for any of the date/time fields. This can be useful for scheduling recurring events, such as annual events, "first-of-the-month" events, or even hourly events.
```yaml
date_range:
enabled: true
ranges:
# Each entry requires start_date, end_date, path values
- start_date: 2020-01-01 # Jan 1st, 2020
end_date: 2020-01-02 # Jan 2nd, 2020
path: /path/to/video.mp4
- start_date: xxxx-07-04 # Every year on July 4th
end_date: xxxx-07-04 # Every year on July 4th
path: /path/to/video.mp4
- start_date: xxxx-xx-02 # Every year on the 2nd of every month
end_date: xxxx-xx-03 # Every year on the 3rd of every month
path: /path/to/video.mp4
- start_date: xxxx-xx-xx 08:00:00 # Every day at 8am
end_date: xxxx-xx-xx 09:30:00 # Every day at 9:30am
path: /path/to/holiday_video.mp4
2021-01-21 02:53:50 +00:00
```
2023-12-08 01:57:30 +00:00
You should [adjust your cron schedule ](#scheduling-script ) to run the script more frequently if you use this feature.
2021-01-21 02:53:50 +00:00
---
2023-12-08 01:57:30 +00:00
## Scheduling Script
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
**NOTE:** Scheduling is handled automatically in the Docker version of this script via the `CRON_SCHEDULE` environment variable.
2021-01-21 02:53:50 +00:00
2023-12-08 01:57:30 +00:00
### Linux
Add to system scheduler:
```sh
crontab -e
```
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
Place desired schedule (example below for every day at midnight)
```sh
0 0 * * * python /path/to/schedule_preroll.py >/dev/null 2>& 1
```
You can also wrap the execution in a shell script (useful if running other scripts/commands, using venv encapsulation, customizing arguments, etc.)
```sh
0 0 * * * /path/to/schedule_preroll.sh >/dev/null 2>& 1
```
2021-01-01 18:51:22 +00:00
2023-12-08 01:57:30 +00:00
Schedule as frequently as needed for your schedule (ex: hourly, daily, weekly, etc.)
2021-01-01 18:51:22 +00:00
---
## Shout out to places to get Pre-Roll
2021-01-21 02:53:50 +00:00
- < a href = "https://prerolls.video" target = "_blank" >< https: // prerolls . video ></ a >