I use Threadfin as a "pre-filter" for a custom channel source to grab Categories from my provider before presenting to Channels (similiar to a m3u4u i suppose-just self hosted). Very helpful as my provider likes to change the channel-id and breaks my Gracenote integration. since i pre-filter in Threadfin, i can avoid this
I'll take a look. Thanks for the suggestion.
I'm looking at something like this for a Docker Compose and environment variables. Anything else I should add?:
version: '3.9'
services:
threadfin:
image: fyb3roptik/threadfin:${TAG}
container_name: threadfin
ports:
- ${HOST_PORT}:34400
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ${HOST_DIR}/conf:/home/threadfin/conf
- ${HOST_DIR}/temp:/tmp/threadfin:rw
restart: unless-stopped
With these example env vars:
TAG=latest
HOST_PORT=34400
PUID=1001
PGID=1001
TZ=America/Los_Angeles
HOST_DIR=/data/threadfin
That looks good to me.
Hello,
My apologies in advance for the question. I've been trying to get the Olive Tin/One-Click setup working. I was following a YouTube video found here along with instructions but can't find it now. I got as far as installing Portainer. Is there a single set of instructions written or video for getting this setup and working ??.
Thank you......
This video?
What if your Portainer port is not 9443? How do you alter that in the stack? Container?
I believe my thinking at the time must have been "Anyone that wants to use an alternate port for Portainer can go pound sand". Kidding aside -- apologies for that -- I'll add an environment variable to handle an alternative to 9443.
I've added an environment variable to support a custom https port for Portainer. This requires the version of OliveTin published today, along with this latest Docker Compose:
version: '3.9'
services:
olivetin: # This docker-compose requires little or no editing. Set the Environment variables section of Portainer.
# 2025.01.22
# GitHub home for this project: https://github.com/bnhf/OliveTin.
# Docker container home for this project with setup instructions: https://hub.docker.com/repository/docker/bnhf/olivetin.
image: bnhf/olivetin:${TAG} # Add the tag like latest or test to the environment variables below.
container_name: olivetin
hostname: olivetin
dns_search: ${DOMAIN} # For Tailscale users using Magic DNS, add your Tailnet (tailxxxxx.ts.net) to use hostnames for remote nodes, otherwise use your local domain name.
ports:
- ${HOST_PORT}:1337
environment:
- CHANNELS_DVR=${CHANNELS_DVR_HOST}:${CHANNELS_DVR_PORT} # Add your Channels DVR server in the form CHANNELS_DVR_HOST=<hostname or ip> and CHANNELS_DVR_PORT=<port>.
#- CHANNELS_DVR_ALTERNATES=${CHANNELS_DVR2_HOST}:${CHANNELS_DVR2_PORT} # 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.
- ALERT_SMTP_SERVER=${ALERT_SMTP_SERVER} # SMTP server to use for sending alert e-mails. smtp.gmail.com:587 for example.
- ALERT_EMAIL_FROM=${ALERT_EMAIL_FROM} # Sender address for alert e-mails.
- ALERT_EMAIL_PASS=${ALERT_EMAIL_PASS} # SMTP "app" password established through GMail or Yahoo Mail. Do not use your everyday e-mail address.
- ALERT_EMAIL_TO=${ALERT_EMAIL_TO} # Recipient address for alert e-mails.
- 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.
- PORTAINER_TOKEN=${PORTAINER_TOKEN} # Generate via <username> dropdown (upper right of WebUI), "My account", API tokens.
- PORTAINER_HOST=${PORTAINER_HOST} # Hostname or IP of the Docker host you're running Portainer on.
- PORTAINER_PORT=${PORTAINER_PORT} # https port you're running Portainer on. 9443 is the default.
volumes:
- ${HOST_DIR}/olivetin:/config # Add the parent directory on your Docker you'd like to use.
- ${DVR_SHARE}:/mnt/${CHANNELS_DVR_HOST}-${CHANNELS_DVR_PORT} # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR network share.
- ${LOGS_SHARE}:/mnt/${CHANNELS_DVR_HOST}-${CHANNELS_DVR_PORT}_logs # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR logs network share.
- ${TUBEARCHIVIST_SHARE}:/mnt/${CHANNELS_DVR_HOST}-${CHANNELS_DVR_PORT}_ta # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your TubeArchivist videos network share.
#- ${DVR2_SHARE}:/mnt/${CHANNELS_DVR2_HOST}-${CHANNELS_DVR2_PORT} # Note that these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between).
#- ${LOGS2_SHARE}:/mnt/${CHANNELS_DVR2_HOST}-${CHANNELS_DVR2_PORT}_logs # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR logs network share.
#- ${TUBEARCHIVIST2_SHARE}:/mnt/${CHANNELS_DVR2_HOST}-${CHANNELS_DVR2_PORT}_ta # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your TubeArchivist videos network share.
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
static-file-server:
image: halverneus/static-file-server:latest
container_name: static-file-server
dns_search: ${DOMAIN}
ports:
- ${HOST_SFS_PORT}:8080
environment:
- FOLDER=${FOLDER}
volumes:
- ${HOST_DIR}/olivetin/data:${FOLDER}
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. Set ${HOST_DIR} to channels-dvr (HOST_DIR=channels_dvr) in that example.
#channels-dvr:
#external: true
#channels-dvr-logs:
#external: true
#tubearchivist:
#external: true
And here's a set of example env vars:
TAG=latest
DOMAIN=tailxxxxx.ts.net
HOST_PORT=1337
CHANNELS_DVR_HOST=local-server
CHANNELS_DVR_PORT=8089
CHANNELS_DVR2_HOST=another-server
CHANNELS_DVR2_PORT=8089
CHANNELS_CLIENTS=appletv4k-den firestick-bedroom
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_EMAIL_FROM=username@gmail.com
ALERT_EMAIL_PASS=xxxxxxxxxxxxxxxx
ALERT_EMAIL_TO=username@gmail.com
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=US/Mountain
HOST_DIR=/data
DVR_SHARE=/mnt/dvr
LOGS_SHARE=/mnt/channelsdvr
TUBEARCHIVIST_SHARE=/mnt/dvr
HOST_SFS_PORT=8080
FOLDER=/web
PORTAINER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PORTAINER_HOST=docker-host
PORTAINER_PORT=9443
If you could confirm back here once you've tested it with your setup, I'll update the compose in the various locations it can be found on this forum and on Docker Hub.
It works great! Thanks so much.
New OliveTin-for-Channels pushed this morning as bnhf/olivetin:latest (aka bnhf/olivetin:2025.01.27) with updates to several Project One-Click Actions.
The SamsungTVPlus-for-Channels now uses vertical bars in place of commas as a delimiter when selecting multiple regions for guide data:
And, the most important update, in preparation for the Super Bowl -- the Tubi-for-Channels Project One-Click Action now supports fields for your Tubi username and password (required for viewing the SB via Tubi):
If you simply want to update an existing Portainer-Stack for either of these projects, you can use the Docker Compose Examples available in Project One-Click:
This will always give the latest recommended Docker Compose, including a version date. These composes are designed to be used without editing, as anything unique to your installation is contained in the env vars. Sample variables are shown under Standard Error
.
If you're updating, stop the stack, paste in the latest compose and check if you need to supply any new env vars based on the samples. Brief descriptions of the values required are shown in the compose's comments. Click the Update the stack
button, and be sure to use the Re-pull and redeploy
slider to be sure you have the latest version of the container from Docker Hub or GitHub.
I was wondering, does the Project One Click Tubi installation routine set up two sources in Channels DVR? (gracenote include w/epg and exclude wo/epg)?
Looking at his shell script, it only creates the gracenote include source, not both.
It's not hard to create the exclude w/o epg source yourself.
Not currently, but it could. I have a framework for doing it that way I use for FrndlyTV. Does the container publish unique M3Us for channels with and without Gracenote data?
@jsfullam As @chDVRuser said, I was creating the Custom Channels Source with the Gracenote M3U only. But, I've rectified that now -- both will be created. I'll push a new container with that fix shortly.
New OliveTin-for-Channels Project One-Click bnhf/olivetin:latest (aka bnhf/olivetin:2025.01.30) pushed this morning with improved support for Tubi-for-Channels.
Two Custom Channel Sources are now created along with the Portainer-Stack when using the One-Click Action.
The first source is called Tubi TV
and includes all channels that have Gracenote guide data. When specifying a CDVR starting channel number in the Action, that number will be used in the custom sources.
The second source is called Tubi TV-NoEPG
and will include those channels without Gracenote data, and will use the XML file in the container for guide data. When specifying a CDVR starting channel number, the channel numbers for this second source will begin at +300 from your specified number, to allow room for the Gracenote channels.
Here's what the auto created Custom Channels Sources will look like:
Thanks. That's what I had done a while back. I was just thinking about streamlining the installation for others.
HI, I just attempted to use Project One-Click to set up Plex on my back-up server. (Synology NAS) Unfortunately, I received the following error:
JSON response from http://192.168.1.25:9000/api/stacks?type=2&method=string&endpointId=2:
{"Id":4,"Name":"plex-for-channels","Type":2,"EndpointId":2,"SwarmId":"","EntryPoint":"docker-compose.yml","Env":[{"name":"TAG","value":"latest"},{"name":"HOST_PORT","value":"7779"},{"name":"PLEX_PORT","value":"7777"},{"name":"PLEX_CODE","value":"local"}],"ResourceControl":{"Id":4,"ResourceId":"2_plex-for-channels","SubResourceIds":[],"Type":6,"UserAccesses":[],"TeamAccesses":[],"Public":false,"AdministratorsOnly":true,"System":false},"Status":1,"ProjectPath":"/data/compose/4","CreationDate":1739236281,"CreatedBy":"john","UpdateDate":0,"UpdatedBy":"","AdditionalFiles":null,"AutoUpdate":null,"Option":null,"GitConfig":null,"FromAppTemplate":false,"Namespace":"","IsComposeFormat":false}
true
{"error":"invalid source url: Get \"http://192.168.1.25:7779/plex/local/playlist.m3u\": context deadline exceeded (Client.Timeout exceeded while awaiting headers)"}
It looks like there's an extra backslash at the end of the playlist address:
Get "http://192.168.1.25:7779/plex/local/playlist.m3u"
Trying to set this up and get error
failed to deploy a stack: Network olivetin_default Creating Network olivetin_default Created Container olivetin Creating Container static-file-server Creating Container static-file-server Created Container olivetin Created Container static-file-server Starting Container olivetin Starting Error response from daemon: Mounts denied: The path /users/olivetin is not shared from the host and is not known to Docker. You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing. See Change settings | Docker Docs for more info.
I'm using a M@ Mac Mini
TAG=latest
DOMAIN=local
HOST_PORT=1337
CHANNELS_DVR_HOST=local-server
CHANNELS_DVR_PORT=8089
CHANNELS_DVR2_HOST=another-server
CHANNELS_DVR2_PORT=8089
CHANNELS_CLIENTS=Living Room Dixon Living Room Master Bedroom
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_EMAIL_FROM=--------------@gmail.com
ALERT_EMAIL_PASS=------------
ALERT_EMAIL_TO=------------@gmail.com
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=US/Central
HOST_DIR=/users
DVR_SHARE=/Volumes/External Drive/Channels DVR
LOGS_SHARE=/Volumes/External Drive/Channels DVR
TUBEARCHIVIST_SHARE=/Volumes/External Drive/Channels DVR
HOST_SFS_PORT=8080
FOLDER=/web
PORTAINER_TOKEN=ptr_TP3q1aaHghJfhw94AMoa6ulP04EI93wfbogZlsKSb3c=
PORTAINER_HOST=172.17.0.3 (I pulled this from IP address listed on the portainer docker)
PORTAINER_PORT=9443