OliveTin for Channels: An Interface for Misc Channels DVR Scripts & Tricks

My thanks for taking the time for this help :slight_smile:

1 Like

Many changes to OliveTin-for-Channels since my last post in this thread. Here are some screenshots of the current lineup of Actions. Note that a "Deprecated" page has been added (accessed via the side blade menu like Project One-Click), where Actions with limited current relevance will be placed:

OliveTin-for-Channels WebUI landing page:

Project One-Click page:

Deprecated page:

Recent significant additions include the TubeArchivist Processing Script, the Live YouTube Channel Manifest URL Updater, TubeArchivist One-Click install and Threadfin One-Click install.

A number of bug fixes, and please note there's a new Docker Compose for this project dated 2025.01.21 -- so please update your compose along with the container!

1 Like

New bnhf/olivetin:latest (aka bnf/olivetin:2025.01.27) pushed this morning with updates to several Project One-Click projects, along with the sample Docker Composes included with OliveTin:

1 Like

Is this the latest version?
It's missing PORTAINER_PORT

Well spotted. Fixed now! :slight_smile:

1 Like

New bnhf/olivetin:latest (aka bnhf/olivetin:2025.01.31) pushed today with improvements in data handling for e-mail notifications in the TubeArchivist Processing Script Action, and the Channel Lineup Change Notifications Action.

More details here:

And here:

Hello. Looking for some help with installing OliveTin in Portainer on unRAID, everything is on the same computer.
I can't seem to get the OliveTin stack to see the DVR_SHARE or the LOGS_SHARE, log posted below.
Here are the values I'm using in the stack:

HOST_DIR
/mnt/user

DVR_SHARE
//tower/pvr/ChannelsDVR

LOGS_SHARE
//tower/pvr/ChannelsPVR

Thanks for any ideas.

Checking your OliveTin installation...
(extended_check=false)

----------------------------------------

Checking that your selected Channels DVR server (192.168.100.47:8089) is reachable by URL:
HTTP Status: 200 indicates success...

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  1276  100  1276    0     0  1246k      0 --:--:-- --:--:-- --:--:-- 1246k
HTTP Status: 200
Effective URL: http://192.168.100.47:8089/

----------------------------------------

Checking that your selected Channels DVR server's data files (/mnt/192.168.100.47-8089) are accessible:
Folders with the names Database, Images, Imports, Logs, Movies, Streaming and TV should be visible...

total 0
drwxr-xr-x 2 root root  40 Feb 17 06:43 .
drwxr-xr-x 1 root root 130 Feb 17 07:25 ..

----------------------------------------

Checking that your selected Channels DVR server's log files (/mnt/192.168.100.47-8089_logs) are accessible:
Folders with the names data and latest should be visible...

total 0
drwxr-xr-x 2 root root  40 Feb 17 06:43 .
drwxr-xr-x 1 root root 130 Feb 17 07:25 ..

----------------------------------------

Here's a list of your current OliveTin-related settings:

HOSTNAME=olivetin
CHANNELS_DVR=192.168.100.47:8089
CHANNELS_DVR_ALTERNATES=
CHANNELS_CLIENTS=192.168.100.125 192.168.100.95 192.168.100.193 192.168.100.21
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_EMAIL_FROM=[Redacted]@gmail.com
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]@gmail.com
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=docker-host

----------------------------------------

Here's the contents of /etc/resolv.conf from inside the container:

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
search local
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [192.168.100.1]
# Overrides: [search]
# Option ndots from: internal

----------------------------------------

Here's the contents of /etc/hosts from inside the container:

127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.19.0.3	olivetin

Rather than using an SMB or NFS share here (which is possible, but has to be done as a Docker Volume), the absolute path is the way to go when everything is on the same system. So, use the Unraid path to your CDVR data directories here.

Similar here, but in this case it's the path to your CDVR executables. If you don't know where that is, you can use the Generate Filtered Channels DVR Log Action to find it. Search the last 100000 lines for [SYS] Start, and use the path shown at startup minus the /data at the end.

2 Likes

Amazing! That makes sense now, thanks for the help! Seems to have done the trick:

Checking your OliveTin installation...
(extended_check=false)

----------------------------------------

Checking that your selected Channels DVR server (192.168.100.47:8089) is reachable by URL:
HTTP Status: 200 indicates success...

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  1276  100  1276    0     0  1246k      0 --:--:-- --:--:-- --:--:-- 1246k
HTTP Status: 200
Effective URL: http://192.168.100.47:8089/

----------------------------------------

Checking that your selected Channels DVR server's data files (/mnt/192.168.100.47-8089) are accessible:
Folders with the names Database, Images, Imports, Logs, Movies, Streaming and TV should be visible...

total 28
drwxrwxrwx  8   99 users   118 Jun 22  2024 .
drwxr-xr-x  1 root root    130 Feb 17 10:54 ..
drwxr-xr-x 32 root root   4096 Feb 17 03:03 Database
drwxr-xr-x  4 root root  16384 Feb 15 16:00 Images
drwxr-xr-x  5 root root     60 Mar 22  2022 Imports
drwxr-xr-x  4 root root     50 Dec 25  2021 Logs
drwxr-xr-x  4 root root     43 Feb 16 11:43 Streaming
drwxr-xr-x 19 root root   4096 Nov 30 13:00 TV

----------------------------------------

Checking that your selected Channels DVR server's log files (/mnt/192.168.100.47-8089_logs) are accessible:
Folders with the names data and latest should be visible...

total 4
drwxrwxrwx 1   99 users  200 Jan 21 17:03 .
drwxr-xr-x 1 root root   130 Feb 17 10:54 ..
drwxr-xr-x 1 root root   134 Sep  4 19:03 2024.09.04.1754
drwxr-xr-x 1 root root   134 Sep 10 17:02 2024.09.10.2115
drwxr-xr-x 1 root root   134 Dec  5 21:04 2024.12.05.1913
drwxr-xr-x 1 root root   134 Dec  7 15:04 2024.12.07.0453
drwxr-xr-x 1 root root   134 Dec  9 21:03 2024.12.10.0055
drwxr-xr-x 1 root root   134 Jan 21 17:03 2025.01.18.0528
drwxrwxrwx 1   99 users 2140 Feb 16 11:40 data
lrwxrwxrwx 1 root root    15 Jan 21 17:03 latest -> 2025.01.18.0528

----------------------------------------

Here's a list of your current OliveTin-related settings:

HOSTNAME=olivetin
CHANNELS_DVR=192.168.100.47:8089
CHANNELS_DVR_ALTERNATES=
CHANNELS_CLIENTS=192.168.100.125 192.168.100.95 192.168.100.193 192.168.100.21
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_EMAIL_FROM=[Redacted]@gmail.com
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]@gmail.com
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=docker-host

----------------------------------------

Here's the contents of /etc/resolv.conf from inside the container:

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
search local
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [192.168.100.1]
# Overrides: [search]
# Option ndots from: internal

----------------------------------------

Here's the contents of /etc/hosts from inside the container:

127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.19.0.3	olivetin

This value should be 192.168.100.47 based on the way you've described your setup.

1 Like

Oh wow, you solved my next issue before I could even tell you about it, lol. I was trying to run the "Create a Stream Link Manager Stack in Portainer Button", but was seeing this error:

stream link manager JSON response from https://docker-host:9443/api/stacks?type=2&method=string&endpointId=2:

Updated the PORTAINER_HOST as you described and we're up and running. You are a gem!

1 Like

New bnhf/olivetin:latest (aka bnhf/olivetin:2025.02.19) pushed this morning with improvements to the OliveTin Post-Install Healthcheck Action.

The following items have been added to the Action's Standard Output:

  • OliveTin-for-Channels version number

  • Suggested DVR_SHARE values for those running their CDVR Server and Docker/Portainer on the same system. (this addition, and the next, are as suggested by @chDVRuser many moons ago)

  • Suggested LOGS_SHARE values for those running their CDVR Server and Docker/Portainer on the same system.

  • PORTAINER_HOST, PORTAINER_PORT and PORTAINER_TOKEN values are tested by using them to get the Portainer version via http and https.

The output is automatically sanitized for posting online, and looks like this:

Checking your OliveTin-for-Channels installation...
(extended_check=false)

Version 2025.02.16

----------------------------------------

Checking that your selected Channels DVR server (media-server8:8089) is reachable by URL:
HTTP Status: 200 indicates success...

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  1276  100  1276    0     0   249k      0 --:--:-- --:--:-- --:--:--  249k
HTTP Status: 200
Effective URL: http://media-server8:8089/

----------------------------------------

Checking that your selected Channels DVR server's data files (/mnt/media-server8-8089) are accessible:
Folders with the names Database, Images, Imports, Logs, Movies, Streaming and TV should be visible...

total 8
drwxr-xr-x 2 1000 1000 4096 Jan 20 01:44 .
drwxr-xr-x 1 root root 4096 Feb 16 07:33 ..
drwxr-xr-x 2 1000 1000    0 Feb 19 07:33 Database
drwxr-xr-x 2 1000 1000    0 Feb 18 23:12 Images
drwxr-xr-x 2 1000 1000    0 Sep 25 08:43 Imports
drwxr-xr-x 2 1000 1000    0 Sep 25 08:43 Logs
drwxr-xr-x 2 1000 1000    0 Jan  2 06:21 Movies
drwxr-xr-x 2 1000 1000    0 Nov 18 06:35 PlayOn
drwxr-xr-x 2 1000 1000    0 Feb 16 19:12 Streaming
drwxr-xr-x 2 1000 1000    0 Feb 16 07:00 TV
drwxr-xr-x 2 1000 1000    0 Jan 20 01:44 tubearchivist

If the listed folders are NOT visible, AND you have your Channels DVR and Docker on the same system:

Channels reports this path as...
G:\dvr

When using a Windows path in Portainer, change the backslashes to slashes like this...
G:/dvr

When using WSL with a Linux distro and Docker Desktop, it's also possible to use...
/mnt/g/dvr

----------------------------------------

Checking that your selected Channels DVR server's log files (/mnt/media-server8-8089_logs) are accessible:
Folders with the names data and latest should be visible...

total 12
drwxr-xr-x 2 1000 1000 4096 Jan 21 16:30 .
drwxr-xr-x 1 root root 4096 Feb 16 07:33 ..
drwxr-xr-x 2 1000 1000    0 Sep 21 02:23 2024.09.10.2115
drwxr-xr-x 2 1000 1000    0 Dec  5 19:40 2024.12.05.1913
drwxr-xr-x 2 1000 1000    0 Dec  7 13:40 2024.12.07.0453
drwxr-xr-x 2 1000 1000    0 Dec  9 19:40 2024.12.10.0055
drwxr-xr-x 2 1000 1000    0 Dec 28 02:37 2024.12.27.0121
-rwxr-xr-x 1 1000 1000  829 Jan 21 16:30 Channels DVR Server.lnk
drwxr-xr-x 2 1000 1000    0 Feb 19 09:15 data
drwxr-xr-x 2 1000 1000    0 Jan 21 16:30 latest

If the listed folders are NOT visible, AND you have your Channels DVR and Docker on the same system:

Channels reports this path as...
C:\ProgramData\ChannelsDVR

When using a Windows path in Portainer, change the backslashes to slashes like this...
C:/ProgramData/ChannelsDVR

When using WSL with a Linux distro and Docker Desktop, it's also possible to use...
/mnt/c/ProgramData/ChannelsDVR

----------------------------------------

Checking if your Portainer token is working on ports 9000 and/or 9443:

Portainer http response on port 9000 reports version 2.21.4
Portainer https response on port 9443 reports version 2.21.4

----------------------------------------

Here's a list of your current OliveTin-related settings:

HOSTNAME=olivetin
CHANNELS_DVR=media-server8:8089
CHANNELS_DVR_ALTERNATES=utheater-pc:8089
CHANNELS_CLIENTS=appletv4k firestick-master
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_EMAIL_FROM=[Redacted]@gmail.com
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]@gmail.com
UPDATE_YAMLS=false
UPDATE_SCRIPTS=false
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=htpc6
PORTAINER_PORT=9443

----------------------------------------

Here's the contents of /etc/resolv.conf from inside the container:

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
search localdomain tail[Redacted].ts.net
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [100.100.100.100]
# Overrides: [search]
# Option ndots from: internal

----------------------------------------

Here's the contents of /etc/hosts from inside the container:

127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.21.0.2	olivetin

There's also an extended check option, which requires running a helper script from the directory on your DOCKER/Portainer host that contains your OliveTin scripts. To get this deeper dive, run this first from the commandline on your host:

sudo -E ./fifopipe_hostside.sh "$PATH" 

If you're running as root, it's:

./fifopipe_hostside.sh "$PATH" 

You'll see this response on your terminal:

This script will be terminated from the container side once the OliveTin healthcheck has finished running...

Running the Healthcheck again, with the extended option, would give output that includes additional system data of potential interest:

Checking your OliveTin-for-Channels installation...
(extended_check=true)

Version 2025.02.16

----------------------------------------

Checking that your selected Channels DVR server (media-server8:8089) is reachable by URL:
HTTP Status: 200 indicates success...

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  1276  100  1276    0     0   178k      0 --:--:-- --:--:-- --:--:--  178k
HTTP Status: 200
Effective URL: http://media-server8:8089/

----------------------------------------

Checking that your selected Channels DVR server's data files (/mnt/media-server8-8089) are accessible:
Folders with the names Database, Images, Imports, Logs, Movies, Streaming and TV should be visible...

total 8
drwxr-xr-x 2 1000 1000 4096 Jan 20 01:44 .
drwxr-xr-x 1 root root 4096 Feb 16 07:33 ..
drwxr-xr-x 2 1000 1000    0 Feb 19 07:33 Database
drwxr-xr-x 2 1000 1000    0 Feb 18 23:12 Images
drwxr-xr-x 2 1000 1000    0 Sep 25 08:43 Imports
drwxr-xr-x 2 1000 1000    0 Sep 25 08:43 Logs
drwxr-xr-x 2 1000 1000    0 Jan  2 06:21 Movies
drwxr-xr-x 2 1000 1000    0 Nov 18 06:35 PlayOn
drwxr-xr-x 2 1000 1000    0 Feb 16 19:12 Streaming
drwxr-xr-x 2 1000 1000    0 Feb 16 07:00 TV
drwxr-xr-x 2 1000 1000    0 Jan 20 01:44 tubearchivist

If the listed folders are NOT visible, AND you have your Channels DVR and Docker on the same system:

Channels reports this path as...
G:\dvr

When using a Windows path in Portainer, change the backslashes to slashes like this...
G:/dvr

When using WSL with a Linux distro and Docker Desktop, it's also possible to use...
/mnt/g/dvr

----------------------------------------

Checking that your selected Channels DVR server's log files (/mnt/media-server8-8089_logs) are accessible:
Folders with the names data and latest should be visible...

total 12
drwxr-xr-x 2 1000 1000 4096 Jan 21 16:30 .
drwxr-xr-x 1 root root 4096 Feb 16 07:33 ..
drwxr-xr-x 2 1000 1000    0 Sep 21 02:23 2024.09.10.2115
drwxr-xr-x 2 1000 1000    0 Dec  5 19:40 2024.12.05.1913
drwxr-xr-x 2 1000 1000    0 Dec  7 13:40 2024.12.07.0453
drwxr-xr-x 2 1000 1000    0 Dec  9 19:40 2024.12.10.0055
drwxr-xr-x 2 1000 1000    0 Dec 28 02:37 2024.12.27.0121
-rwxr-xr-x 1 1000 1000  829 Jan 21 16:30 Channels DVR Server.lnk
drwxr-xr-x 2 1000 1000    0 Feb 19 09:15 data
drwxr-xr-x 2 1000 1000    0 Jan 21 16:30 latest

If the listed folders are NOT visible, AND you have your Channels DVR and Docker on the same system:

Channels reports this path as...
C:\ProgramData\ChannelsDVR

When using a Windows path in Portainer, change the backslashes to slashes like this...
C:/ProgramData/ChannelsDVR

When using WSL with a Linux distro and Docker Desktop, it's also possible to use...
/mnt/c/ProgramData/ChannelsDVR

----------------------------------------

Checking if your Portainer token is working on ports 9000 and/or 9443:

Portainer http response on port 9000 reports version 2.21.4
Portainer https response on port 9443 reports version 2.21.4

----------------------------------------

Here's a list of your current OliveTin-related settings:

HOSTNAME=olivetin
CHANNELS_DVR=media-server8:8089
CHANNELS_DVR_ALTERNATES=utheater-pc:8089
CHANNELS_CLIENTS=appletv4k firestick-master
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_EMAIL_FROM=[Redacted]@gmail.com
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]@gmail.com
UPDATE_YAMLS=false
UPDATE_SCRIPTS=false
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=htpc6
PORTAINER_PORT=9443

----------------------------------------

Here's the contents of /etc/resolv.conf from inside the container:

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
search localdomain tail[Redacted].ts.net
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [100.100.100.100]
# Overrides: [search]
# Option ndots from: internal

----------------------------------------

Here's the contents of /etc/hosts from inside the container:

127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.21.0.2	olivetin

----------------------------------------

Your Docker-host is running:

 "Debian GNU/Linux 11 (bullseye)"

----------------------------------------

Your Docker-host's /etc/resolv.conf file contains:

# resolv.conf(5) file generated by tailscale
# For more info, see https://tailscale.com/s/resolvconf-overwrite
# DO NOT EDIT THIS FILE BY HAND -- CHANGES WILL BE OVERWRITTEN

nameserver 100.100.100.100
search tail[Redacted].ts.net

----------------------------------------

Your Docker-host's /etc/hosts file contains:

127.0.0.1	localhost
::1		localhost ip6-localhost ip6-loopback
ff02::1		ip6-allnodes
ff02::2		ip6-allrouters
# --- BEGIN PVE ---
192.168.110.111 htpc6.tail[Redacted].ts.net htpc6
# --- END PVE ---

----------------------------------------

Your Tailscale version is:

1.76.1
  tailscale commit: 24929f6b611127cdc40d45ef40d75c6afc1fcc4c
  other commit: 5e54dcf15265cb83e84e617a5a7e0c1b013c61c7
  go version: go1.23.1

----------------------------------------
1 Like

New bnhf/olivetin:latest (aka bnhf/olivetin:2025.02.20) pushed this morning with support for Portainer's recent API changes. If you're running Portainer 2.27.0 or newer, you'll need OliveTin-for-Channels 2025.02.20 or newer to use Project One-Click.

1 Like

One thing that would make it easier for users when assigning environment variables in a stack is to list them in alphabetical order in all your examples. Makes it much easier when reading the description of them in the compose statement to find them in the list. Also easier to compare and see if a user is missing any.
Example from your first post.

ALERT_EMAIL_FROM=username@gmail.com
ALERT_EMAIL_PASS=xxxxxxxxxxxxxxxx
ALERT_EMAIL_TO=username@gmail.com
ALERT_SMTP_SERVER=smtp.gmail.com:587
CHANNELS_CLIENTS=appletv4k-den firestick-bedroom
CHANNELS_DVR2_HOST=another-server
CHANNELS_DVR2_PORT=8089
CHANNELS_DVR_HOST=local-server
CHANNELS_DVR_PORT=8089
DOMAIN=tailxxxxx.ts.net
DVR_SHARE=/mnt/dvr
FOLDER=/web
HOST_DIR=/data
HOST_PORT=1337
HOST_SFS_PORT=8080
LOGS_SHARE=/mnt/channelsdvr
PORTAINER_HOST=docker-host
PORTAINER_PORT=9443
PORTAINER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TAG=latest
TUBEARCHIVIST_SHARE=/mnt/dvr
TZ=US/Mountain
UPDATE_SCRIPTS=true
UPDATE_YAMLS=true
1 Like

New bnhf/olivetin:latest (aka bnhf/olivetin:2025.03.01) pushed with support for a classic DVR "Reminder" feature. When this OliveTin Action is active, any DVR job created with 10 or 30 second padding added (BEFORE or AFTER), will generate one or more notifications.

These notifications are via Apprise (100+ types of push, SMS, e-mail and other), or specially defined channels:// or olivetin:// values. channels:// sends an onscreen notification to all Channels clients defined in in the OliveTin env var CHANNELS_CLIENTS. olivetin:// sends a notification to what you defined in the ALERT_EMAIL set of OliveTin env vars. Multiple notification URLs can be used, space separated.

The DVR job you defined can either be left in place to create a recording, or you can choose to have the job deleted after the notifications are sent:

screenshot-htpc6-2025_02_28-14_43_52

1 Like

Looks useful. Couple of questions.

So if I set a 10 sec pre pad on a recording scheduled in 12 days and selected frequency=5 mins and delete_job=false.

It would notify me every 5 minutes, until the recording completed?

If I select delete_job=true, it would notify me every 5 minutes, until when?
and when would the scheduled job be deleted?

No. The 5 minutes defines two things. First, the frequency the dvr is polled for jobs, and second this defines how close to the job's start_time to generate the notification. I'm currently dividing the interval in half -- looking 2.5 minutes before the current time and 2.5 minutes after the current time.

Thinking about it now though, I'm not sure there's any advantage for doing it that way. It seems to make more sense to only look at events occurring in the next 5 minutes (in this example), and not look back at all. Thoughts?

If set to true, the job will be deleted after the notification is sent.

Just tested using Pushover combined with the special channels:// URL. This works nicely, as you'll still get notified even if you're not actively watching something on a Channels client. It looks like Pushover has a 30-day trial, and then there's a one-time charge per platform (iOS, Android, Desktop).

You'll use your Pushover User Key, combined with an API Token (which is created on the Pushover site, and is per application -- like OliveTin). The apprise_url value would look like this, with the two options:

channels:// pover://userkey@apitoken

Note the space is required between each notification option you specify!

@chDVRuser Playing around with this a bit more, I believe I will move to looking exclusively forward for job matches based on the interval specified. However, it does take a few seconds from when the current api/v1/jobs JSON is grabbed and jq'd for any matches, to when the script loop is complete. To avoid having a missed match between loops, I think it makes sense to look forward an extra 10 seconds.

This will result in the possibility of a second notification for anyone not deleting the dvr job after the notification is sent -- but this should be reasonably rare. I'd rather have the odd double notification, as opposed to having anything fall in an unaccounted-for gap between loops (which measured at 7 seconds in my case, with 2 clients offline).

I just set it up and manually scheduled a recording with 10 second pre-pad that starts in 3 minutes.
Have it set to email notification using olivetin://

Got an email titled Reminder a minute before it started recording
Event: The Big Bang Theory
Start Time: 16:30
Channels: 6033

I'll set another recording further out and see when the notification happens.
Would be nice if it logged it too. The file 192.168.1.4-8190_remind.running only contains this

remind.sh 192.168.1.4:8190 5 10 "olivetin://" false