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
2023-12-08 07:57:02 +00:00
- If you have a large set of prerolls, you can provide all paths and use `random_count` to randomly select a smaller subset of the list to use on each run.
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
2023-12-08 07:57:02 +00:00
weight: 2 # Add these paths to the list twice (make up greater percentage of prerolls - more likely to be selected)
2023-12-08 01:57:30 +00:00
- 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
2023-12-08 07:57:02 +00:00
weight: 1
2023-12-08 01:57:30 +00:00
- 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
2023-12-08 07:57:02 +00:00
weight: 1
2023-12-08 01:57:30 +00:00
- 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
2023-12-08 07:57:02 +00:00
weight: 1
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 07:57:02 +00:00
`date_range` entries also accept an optional `weight` value that can be used to adjust the emphasis of this entry over others by adding the listed paths multiple times. Since Plex selects a random preroll from the list of paths, having the same path listed multiple times increases its chances of being selected over paths that only appear once. This allows you to combine, e.g. a `date_range` entry with a `misc` entry, but place more weight/emphasis on the `date_range` entry.
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 >