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

@chDVRuser As one of our resident experts on Channels API endpoints, what would be required to run a metadata update as referenced here?:

Looks like it's going to be implemented in Channels DVR

Is the only way to clear the Logs view by restarting the docker container?

I have 59 entries showing
2023-10-23 20:27:07 List Channels with Comskip Off
2023-10-23 20:26:59 List Channels with Comskip Off
2023-10-23 20:26:53 List Channels with Comskip Off
2023-10-23 20:26:45 List Channels with Comskip Off
2023-10-23 20:26:38 List Channels with Comskip Off
2023-10-23 18:27:21 Generate Filtered Channels DVR Log
2023-10-23 18:27:09 Generate Filtered Channels DVR Log
2023-10-23 18:26:43 Generate Filtered Channels DVR Log
2023-10-23 18:25:45 Generate Filtered Channels DVR Log
2023-10-23 18:15:29 Generate Filtered Channels DVR Log
2023-10-23 18:12:10 Generate Filtered Channels DVR Log
2023-10-23 16:42:31 Generate Filtered Channels DVR Log
2023-10-23 16:42:15 Generate Filtered Channels DVR Log
2023-10-23 16:17:15 Generate Filtered Channels DVR Log
2023-10-23 14:56:56 Generate Filtered Channels DVR Log
2023-10-23 14:26:53 Generate Filtered Channels DVR Log
2023-10-23 14:19:31 Generate Filtered Channels DVR Log
2023-10-23 14:18:13 Generate Filtered Channels DVR Log
2023-10-23 13:59:44 Generate Filtered Channels DVR Log
2023-10-23 13:59:04 Generate Filtered Channels DVR Log
2023-10-23 13:58:33 Generate Filtered Channels DVR Log
2023-10-23 13:50:34 Generate Filtered Channels DVR Log
2023-10-23 13:44:21 Generate Filtered Channels DVR Log
2023-10-23 13:44:11 Generate Filtered Channels DVR Log
2023-10-23 13:44:01 Generate Filtered Channels DVR Log
2023-10-23 13:43:49 Generate Filtered Channels DVR Log
2023-10-23 13:43:36 Generate Filtered Channels DVR Log
2023-10-23 13:39:11 Generate Filtered Channels DVR Log
2023-10-23 13:38:28 Generate Filtered Channels DVR Log
2023-10-23 13:36:37 Generate Filtered Channels DVR Log
2023-10-23 13:23:03 Generate Filtered Channels DVR Log
2023-10-23 13:21:46 Generate Filtered Channels DVR Log
2023-10-23 13:21:13 Generate Filtered Channels DVR Log
2023-10-23 13:20:07 Generate Filtered Channels DVR Log
2023-10-23 13:18:45 Generate Filtered Channels DVR Log
2023-10-23 13:16:11 Generate Filtered Channels DVR Log
2023-10-23 13:15:15 Generate Filtered Channels DVR Log
2023-10-23 13:13:42 Generate Filtered Channels DVR Log
2023-10-23 13:11:57 Generate Filtered Channels DVR Log
2023-10-23 13:11:04 Generate Filtered Channels DVR Log
2023-10-23 13:10:00 Generate Filtered Channels DVR Log
2023-10-23 12:19:13 Generate Filtered Channels DVR Log
2023-10-23 11:58:04 Docker-Compose Examples for Channels & Related Extensions
2023-10-23 11:42:43 Create Channels List in CSV Format
2023-10-23 10:07:29 Channel Lineup Change Notifications (23Oct23_09:11)
2023-10-23 09:11:04 Channel Lineup Change Notifications (23Oct23_08:38)
2023-10-23 08:38:00 Channel Lineup Change Notifications (22Oct23_17:05)
2023-10-22 17:48:57 Docker-Compose Examples for Channels & Related Extensions
2023-10-22 17:47:55 Docker-Compose Examples for Channels & Related Extensions
2023-10-22 17:06:33 Channel Lineup Change Notifications (22Oct23_17:05)
2023-10-22 17:06:22 Channel Lineup Change Notifications (22Oct23_17:05)
2023-10-22 17:06:13 Channel Lineup Change Notifications (22Oct23_17:05)
2023-10-22 17:06:04 Channel Lineup Change Notifications (22Oct23_17:05)
2023-10-22 17:05:54 Channel Lineup Change Notifications
2023-10-22 17:05:40 Channel Lineup Change Notifications (22Oct23_15:05)
2023-10-22 17:05:30 Channel Lineup Change Notifications (22Oct23_15:05)
2023-10-22 17:05:21 Channel Lineup Change Notifications (22Oct23_15:05)
2023-10-22 17:05:09 Channel Lineup Change Notifications (22Oct23_15:05)
2023-10-22 17:05:00 Channel Lineup Change Notifications (22Oct23_15:05)

and can't tell what they are from unless I open the STDOUT and STDERR, and even then some don't display the DVR I ran it against.

If it's not too difficult it would be nice to have a Delete/Clear next to each one.

Good point! Since, I've been in development mode I've been restarting frequently enough that I don't get much build-up of results. But I can see the issue.

As far as making sure that each result reflects which DVR it came from that's something I can work on. A delete button per log entry would be something we'd need to lobby the OliveTin developer for. I'll see what I can figure out about how and where the log entries are stored, and maybe we can reset the entire log without a container restart -- or better yet some sort of a date cutoff to purge older entries?

Let me know which activities need a DVR reference added, as you come across them, and I'll add it.

Another thought I had is if the individual action logs (std & err out), wherever they're currently held, can be moved to ActionLog files in the /config directory then there's no need to keep the Log display on the web page. Maybe replace that page with an ActionLog file picker? One could always delete an ActionLog file from the /config directory if they no longer need to retain it.

List Channels with Comskip Off
Mark an Episode for Re-Recording

I ran into issues previously with docker containers on my Synology when volumes were mapped like you did Channels DVR on docker - #38 by chDVRuser and I found out it works fine if I mapped them to the Docker folder /volume1/docker
So for yours, this should work without causing permission issues

volumes:
      - /volume1/docker/olivetin:/config # replace host path or volume as needed

and then no need to use

    user: root

I don't remember when, but I came to the same conclusion on the volume mapping and mine looks exactly as you show. Thanks for the followup.

1 Like

Thinking about this a bit more, what if we sent all stdout to a log file in addition to stdout? Something like:

host-ip_scriptname_latest.log

So we'd know what was run, for which DVR, and that it would be the most recent -- as we'd overwrite the previous "latest"?

The OliveTin log would be there to look at right away, with our log files available and persistent through restarts.

Sounds good. I would have to look at an actual example to be sure.

host-ip_scriptname_latest.log wouldn't work for me as all my DVR's have the same IP address and different ports.
Would need host-ip-port_scriptname_latest.log

We're on the same page -- that's what I meant to write, host:port_scriptname_latest.log.

Seems like this will be a good approach.

1 Like

I know you really mean host-port_scriptname_latest.log :smile:
Windows doesn't allow the colon character in a filename.

Doh! Yes, absolutely.

This might be useful if someone is remote and has remote access to OliveTin for Channels and needs to restart or stop their Channels DVR service.

I'll leave it up to you if you want to include it or not.
I just run it from a command line when needed.

I would show a warning before running it that anyone using it should know what they're doing and accept the consequences of continuing. It will stop anything in progress, including recordings.

Another excellent suggestion!

I've done a build under the :test tag, and it includes the following new or updated OliveTin Actions:

Restart or Shutdown a Channels DVR Server - Restart or shutdown a DVR the easy way!

Remove Comskip Markers from a Recording - If you've edited a recording to remove the commercials, or had Comskip run on a recording where there are no commercials, this action removes all commercial markers from the DVR for the recording.

List Channels with Comskip Off - This action has been updated to show the DVR name in stdout, and the most recent run of this command will be available as host-port_listcomskipignore_latest.log in the /config directory.

Mark an Episode for Re-recording - This action has been updated to show the DVR name in stdout, and the most recent run of this command will be available as host-port_markforrerecording_latest.log in the /config directory.

And, the current suite of OliveTin Actions:

In the next build, I'll be adding DVR name output to the stdout of all actions where it makes sense -- as well as producing log files in the form host-port_scriptname_latest.log. These will survive restarts, and allow for a quick check of recent results.

Container crashes.
Docker log for the container only shows this as STD OUT
standard_init_linux.go:230: exec user process caused: no such file or directory

And there is nothing in the /config directory.

Thanks for letting me know. I'm in Portugal, so I'm doing a bit of a funky multi-arch build with my laptop here as one node and the ARM node back in the US.

Probably something not quite right with the setup. You should be able to revert to :latest while I chase down the problem.

OK, if it matters, I had removed the :latest build container and image and emptied the /config mapped directory before installing this :test version. So it's a fresh install using the same environment variables I was using before.

docker pull bnhf/olivetin:test
docker run \
 -d \
 --name=olivetin \
 --network=cdvr-net \
 -p 192.168.1.3:1337:1337/tcp \
 --restart=unless-stopped \
 -v /volume1/docker/olivetin:/config \
 -e "TZ=America/Los_Angeles" \
 -e "UPDATE_SCRIPTS=true" \
 -e "UPDATE_YAMLS=true" \
 -e "CHANNELS_DVR=192.168.1.4:8489" \
 -e "CHANNELS_DVR_ALTERNATES=192.168.1.4:8389 192.168.1.4:8089 192.168.1.4:8189 192.168.1.4:8289" \
 bnhf/olivetin:test

@chDVRuser :test build should be good-to-go now. I pulled it here, and seemed fine in some quick testing. I'll work on adding additional log files to actions that could benefit from them next.

Here's my current recommended docker-compose for this project:

version: '3.9'
services:
  olivetin:
    image: bnhf/olivetin:${TAG} # Add the tag like latest or test to the environment variables below
    container_name: olivetin
    dns_search: ${TAILNET} # For Tailscale users using Magic DNS, add your Tailnet (tailxxxxx.ts.net) to use hostnames for remote nodes
    ports:
      - 1337:1337
    environment:
      - CHANNELS_DVR=${CHANNELS_DVR} # Add your Channels DVR server in the form hostname:port or ip:port
      - CHANNELS_DVR_ALTERNATES=${CHANNELS_DVR_ALTERNATES} # Space separated list of alternate Channels DVR servers to choose from in the form hostname:port or ip:port
      - CHANNELS_CLIENTS=${CHANNELS_CLIENTS} # Space separated list of Channels DVR clients you'd like notifications sent to in the form hostname or IP
      - UPDATE_YAMLS=${UPDATE_YAMLS} # Set this to true to update config.yaml
      - UPDATE_SCRIPTS=${UPDATE_SCRIPTS} # Set this to true to update all included scripts
      - TZ=${TZ} # Add your local timezone in standard linux format. E.G. US/Eastern, US/Central, US/Mountain, US/Pacific, etc
    volumes:
      - ${HOST_DIR}/olivetin:/config # Add the parent directory on your Docker you'd like to use
      - ${DVR_SHARE}:/mnt/dvr # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR network share
    restart: unless-stopped
#volumes: # use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /mnt/dvr inside the container
  #channels-dvr:
    #external: true

And, sample environment variables:

TAG=latest
TAILNET=tailxxxxx.ts.net
CHANNELS_DVR=media-server6:8089
CHANNELS_DVR_ALTERNATES=utheater-pc:8089
CHANNELS_CLIENTS=appletv4k firestick-master
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=US/Mountain
HOST_DIR=/data
DVR_SHARE=/mnt/dvr

:test build working here now.
Tried a couple things and enabled channel change notifications again.

New :test build available, with a couple of new features to validate:

  • Ping Channels DVR Server - I've been using this for a few days myself, and I really like it. This allows one to setup a scheduled ping of one or more servers -- with or without a healthchecks.io tie-in. If you're an Organizr user, there's a homepage integration for healthchecks.io:

And the second change (as requested by @chDVRuser) is the addition of:

  • Support for use of a saved file with the "Generate Filtered Channels DVR Log" Action. Save a file in the /config directory with a .grep extension, and then reference it as file://your_saved_filter.grep in the filter field. NOTE: Any special characters in the saved grep search file will be escaped for you!

BTW, healthchecks.io supports lots of different integrations, so if you want push notifications on your phone instead of (or in addition to) e-mails you can set that up through healthchecks.io:

2 Likes