Thanks for that response which was enough to jog my memory. I now remember how I open a video session from the IP address of the EndPoint.so I can use the remote to sign in to YouTube. I got both signed in and working.
Move over to LinkPi thread.
I pushed a new build (20260906-4) to both stable and development this morning.
Compared to the previous development build it's just a few small bug fixes and some polish.
Compared to the last stable build it includes the following changes:
- Updated admin user interface to make it easier to manage a large amount of tuners and/or channels
- Added the ability to backup and restore an entire ADBTuner instance
- Added additional capabilities to Tuning Configurations (in app docs:
/ui/configurations/documentation) - Added (beta) feature that uses the Android remote interface to automatically re-enable ADB on Android 14 devices that disable ADB on each reboot (ex. CCWGTV). Devices that don't do this are still preferred, but this provides a reasonable path to continue using them.
- Bug fixes and optimizations
Please let me know if you run into any issues. Thanks!
I’ve been using ADBTuner for quite some time with a single encoder.
As OTT channels evaporate from YouTubeTV, I’m adding a couple more encoders, and rolling every YouTube TV channel into ADBTuner. (Whether they’re available OTT or not)
Question: What are you guys doing for your channel numbering? So far I’ve been trying to follow the channel numbering that comes in from the guide data, but that lead to a channel number that doesn’t really make much sense.
- Do you guys group all of the news channels together?
- Do you guys group all of the sports channels together?
- Do you guys group all of the entertainment channels together?
- Do you alphabetize?
Just trying to think of some ways to have this make a bit more sense.
A new development build (20260907-9) was released this morning. It adds an activity feed to provide more insight into how well the application is working and to assist with troubleshooting.
Tuning logs are kept for 30 days, but are limited to the last 1,000 for those that may watch a ton of TV. Low resolution screenshots are included, but are automatically disabled if less than 500MB of storage is available in the docker volume.
I pushed a new development version (20260909-2) this morning. It adds a new feature I'm calling Passthrough Channels that will allow other projects to use ADBTuner's tuning resources.
It loads a remote playlist (m3u) and populates virtual ADBTuner channels with the channel fields provided by the remote playlist. These fields can then be used with custom tuning configurations.
This is new and probably needs some more work. If anyone has time to help test that would be appreciated. It works well with FastChannels "bridge" channels.
I wrote up some notes on that here:
I just happened to check my ADBTuner page today and while the tuners are actually working and I'm seeing channels playing through Channels DVR like normal, my latest version of ADBTuner is showing "Failed to Load Tuner Data" and to "Check the container logs for details". I tried restarting the container (I have it installed through portainer on an Ubuntu Server 26.04.1) and I even tried an entire reinstall of the container and same result. I'm attaching a picture of what I'm seeing.
And here is what my logs show:
return cls.__pydantic_validator__.validate_python(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
obj,
^^^^
...<5 lines>...
by_name=by_name,
^^^^^^^^^^^^^^^^
)
^
pydantic_core._pydantic_core.ValidationError: 1 validation error for TunerSchema
keep_alive
Input should be a valid boolean [type=bool_type, input_value=None, input_type=NoneType]
For further information visit https://errors.pydantic.dev/2.13/v/bool_type
2026-09-08 15:17:09.614 - uvicorn.access - 192.168.1.6:0 - "GET /api/v1/tuners/installed-packages HTTP/1.1" 200
2026-09-08 15:18:17.982 - stream - [Tune n2EKUqA5JN3QwumeeiqyFX] 192.168.1.36:5592 | channels-dvr/2026.09.05.0220 Go-http-client/1.1 (windows-x86_64)
2026-09-08 15:18:17.985 - stream - [Tune (n2EKUqA5JN3QwumeeiqyFX)] No active tuners found for NBC Sports Philadelphia. Reserving a new tuner.
2026-09-08 15:18:17.986 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Attempting to reserve tuner for: ['com.google.android.youtube.tvunplugged'].
2026-09-08 15:18:17.991 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Available Tuners:
2026-09-08 15:18:17.991 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Name: Google TV Priority: 1
2026-09-08 15:18:17.991 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Name: Google TV 2 Priority: 2
2026-09-08 15:18:17.991 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Using first available tuner (by priority).
2026-09-08 15:18:17.991 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Reserved Tuner: Name: Google TV Priority: 1
2026-09-08 15:18:17.991 - stream - [Tune (n2EKUqA5JN3QwumeeiqyFX)] Tuning to NBC Sports Philadelphia on Google TV
2026-09-08 15:18:17.994 - stream - [Tune (n2EKUqA5JN3QwumeeiqyFX)] Using channel configuration: Deep Links - Compatibility Mode (ADBTuner) (bb353259-17e0-4b38-a328-8629fb1ec2ca)
2026/09/08 15:18:18 [PROXY] Registered pending stream for key n2EKUqA5JN3QwumeeiqyFX
2026-09-08 15:18:18.009 - stream - [Tune n2EKUqA5JN3QwumeeiqyFX] MPEG null packets mode: Redirecting immediately to /proxy/1?requestKey=n2EKUqA5JN3QwumeeiqyFX
2026-09-08 15:18:18.009 - uvicorn.access - 192.168.1.6:0 - "GET /stream/51 HTTP/1.1" 307
2026/09/08 15:18:18 [PROXY] 192.168.1.6 -> GET "/proxy/1?requestKey=n2EKUqA5JN3QwumeeiqyFX" -> "http://192.168.1.26:8090/stream0"
2026/09/08 15:18:18 [PROXY] Starting null packet stream for key n2EKUqA5JN3QwumeeiqyFX
2026-09-08 15:18:18.181 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] ADB: 192.168.1.2 - pidof com.google.android.youtube.tvunplugged
2026-09-08 15:18:18.279 - tuning - [Tune (n2EKUqA5JN3QwumeeiqyFX)] Using https://tv.youtube.com/watch/89dEK_TTJTM to load channel.
2026-09-08 15:18:18.279 - tuning - [Tune (n2EKUqA5JN3QwumeeiqyFX)] Executing pre-tune commands: [{'type': 'ADB', 'command': 'input keyevent KEYCODE_MEDIA_STOP'}, {'type': 'ADB', 'command': "am force-stop 'com.google.android.youtube.tvunplugged'"}, {'type': 'ADB', 'command': 'sleep 2'}]
2026-09-08 15:18:18.279 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] ADB: 192.168.1.2 - input keyevent KEYCODE_MEDIA_STOP
2026-09-08 15:18:18.399 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] ADB: 192.168.1.2 - am force-stop 'com.google.android.youtube.tvunplugged'
2026-09-08 15:18:18.518 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] ADB: 192.168.1.2 - sleep 2
2026-09-08 15:18:18.518 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] ADB: Sleeping for 2.0 seconds.
2026-09-08 15:18:20.519 - tuning - [Tune (n2EKUqA5JN3QwumeeiqyFX)] Executing tune commands: [{'type': 'ADB', 'command': "am start -W -a android.intent.action.VIEW -d 'https://tv.youtube.com/watch/89dEK_TTJTM' 'com.google.android.youtube.tvunplugged'"}]
2026-09-08 15:18:20.519 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] ADB: 192.168.1.2 - am start -W -a android.intent.action.VIEW -d 'https://tv.youtube.com/watch/89dEK_TTJTM' 'com.google.android.youtube.tvunplugged'
2026-09-08 15:18:21.161 - tuning - [Tune n2EKUqA5JN3QwumeeiqyFX] Starting tune match text monitoring. Match commands: [{'match_text': ["who's watching", 'choose an account', 'edit profiles'], 'commands': [{'type': 'ADB', 'command': 'input keyevent KEYCODE_DPAD_CENTER'}], 'start_checking_after_seconds': 5}]
2026-09-08 15:18:21.600 - tuning - [Tune n2EKUqA5JN3QwumeeiqyFX] Waiting for playback start. Status: unknown
2026/09/08 15:18:23 [PROXY] Sending null packets for key n2EKUqA5JN3QwumeeiqyFX (5.001s elapsed, 65800 bytes sent)
2026-09-08 15:18:23.243 - server -
--------------------------------------------------
Tuner "Google TV" is currently in use and locked.
Tune ID: n2EKUqA5JN3QwumeeiqyFX
Channel: NBC Sports Philadelphia
Lock Obtained: 2026-09-08 15:18:17 (0.1 minutes ago)
Last Seen: 2026-09-08 15:18:23 (0.24 seconds ago)
Bytes Transferred: 68432 (0.07MB)
Remote User Agent:
channels-dvr/2026.09.05.0220 Go-http-client/1.1
(windows-x86_64)
--------------------------------------------------
2026-09-08 15:18:25.379 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] Detected 100.0% black pixels. Assuming HDCP is active and video is playing.
2026/09/08 15:18:25 [PROXY] Signaled stream start for key n2EKUqA5JN3QwumeeiqyFX
2026/09/08 15:18:25 [PROXY] Switching to real stream for key n2EKUqA5JN3QwumeeiqyFX after 7.381s (73 batches sent)
2026/09/08 15:18:25 [PROXY] Beginning reverse proxy for key n2EKUqA5JN3QwumeeiqyFX
2026-09-08 15:18:25.392 - tuning - [Tune n2EKUqA5JN3QwumeeiqyFX] Signaled proxy to start real stream.
2026-09-08 15:18:25.393 - tuning - [Tune n2EKUqA5JN3QwumeeiqyFX] Tuning completed after 7.41 seconds. [Tune n2EKUqA5JN3QwumeeiqyFX] Display was on, application (com.google.android.youtube.tvunplugged) was closed.
2026-09-08 15:18:25.393 - tuning - Initializing keep active command schedule for tuner Google TV (1).
2026/09/08 15:18:25 [PROXY] No keyframe found within 500ms for key n2EKUqA5JN3QwumeeiqyFX (16732 bytes buffered), flushing buffer
2026-09-08 15:18:28.750 - tuning - [Tune n2EKUqA5JN3QwumeeiqyFX] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
2026-09-08 15:18:34.478 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] On screen text: '7 =o ore jj crp cuetamer recnancihility praaram pgworks.com'
2026-09-08 15:18:34.478 - tuning - [Tune n2EKUqA5JN3QwumeeiqyFX] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
2026-09-08 15:18:37.068 - lib.adb - [Tune n2EKUqA5JN3QwumeeiqyFX] Detected 100.0% black pixels. Assuming HDCP is active and video is playing.
2026-09-08 15:18:37.070 - tuning - [Tune n2EKUqA5JN3QwumeeiqyFX] Media playback detected. Stopping tuning text match process.
2026-09-08 15:18:53.258 - server -
--------------------------------------------------
Tuner "Google TV" is currently in use and locked.
Tune ID: n2EKUqA5JN3QwumeeiqyFX
Channel: NBC Sports Philadelphia
Lock Obtained: 2026-09-08 15:18:17 (0.6 minutes ago)
Last Seen: 2026-09-08 15:18:53 (0.26 seconds ago)
Bytes Transferred: 19687924 (18.78MB)
Remote User Agent:
channels-dvr/2026.09.05.0220 Go-http-client/1.1
(windows-x86_64)
--------------------------------------------------
2026-09-08 15:19:02.056 - tuner_management - Releasing tuner 1 as it has been inactive for 8 seconds.
2026-09-08 15:19:02.056 - tuner_management - Releasing tuner: {'lock_obtained': 1788880697, 'tuner_name': 'Google TV', 'name': 'NBC Sports Philadelphia', 'number': 48, 'provider_name': 'YouTube TV', 'tuner_id': 1, 'channel_id': 51, 'tuning_status': 'tuned', 'request_key': 'n2EKUqA5JN3QwumeeiqyFX', 'target_package': 'com.google.android.youtube.tvunplugged'}
2026-09-08 15:19:02.209 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Using configuration: Deep Links - Compatibility Mode (ADBTuner) (bb353259-17e0-4b38-a328-8629fb1ec2ca) for channel cleanup.
2026-09-08 15:19:02.209 - tuner_management - Post tune commands: [{'type': 'ADB', 'command': "am force-stop 'com.google.android.youtube.tvunplugged'"}, {'type': 'ADB', 'command': 'input keyevent KEYCODE_HOME'}]
2026-09-08 15:19:02.209 - lib.adb - [Pool 1] ADB: 192.168.1.2 - am force-stop 'com.google.android.youtube.tvunplugged'
2026-09-08 15:19:02.370 - lib.adb - [Pool 1] ADB: 192.168.1.2 - input keyevent KEYCODE_HOME
2026-09-08 15:19:02.776 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Released tuner (1).
2026-09-08 15:19:02.776 - tuner_management - [Tune n2EKUqA5JN3QwumeeiqyFX] Cleanup complete. Google TV (NBC Sports Philadelphia)
2026-09-08 15:19:09.108 - uvicorn.access - 192.168.1.6:0 - "GET /api/v1/tuners/installed-packages HTTP/1.1" 200
2026-09-08 15:19:17.276 - uvicorn.access - 192.168.1.6:0 - "GET /api/v1/repositories HTTP/1.1" 200
2026-09-08 15:19:17.284 - uvicorn.access - 192.168.1.6:0 - "GET /api/v1/repositories/settings HTTP/1.1" 200
2026-09-08 15:19:33.040 - tuner_operations - Starting health check for 2 tuner(s).
2026-09-08 15:19:33.040 - tuner_operations - Google TV: Starting health check.
2026-09-08 15:19:33.123 - tuner_operations - Google TV: Health check complete.
2026-09-08 15:19:33.123 - tuner_operations - Google TV 2: Starting health check.
2026-09-08 15:19:33.227 - tuner_operations - Google TV 2: Health check complete.
2026-09-08 15:19:33.243 - uvicorn.access - 192.168.1.6:0 - "GET /up HTTP/1.1" 200
2026-09-08 15:19:41.400 - uvicorn.access - 192.168.1.6:0 - "GET /api/v1/tuners/installed-packages HTTP/1.1" 200
2026-09-08 15:19:43.242 - uvicorn.access - 192.168.1.6:0 - "GET /api/v1/tuners/installed-packages HTTP/1.1" 200
2026-09-08 15:19:44.629 - uvicorn.access - 192.168.1.6:0 - "GET /api/v1/tuners/installed-packages HTTP/1.1" 200`Preformatted text`
Not quite sure what is going on here. Hoping someone can help me out. Thanks!
Can you pull the updated version (20260909-9) and let me know if this is fixed?
Working good now with version 20260909-10 Thanks!
Some updated instructions for using the Passthrough Channel List feature with FastChannels v5.2.2.
How to add FastChannels Player sources to ADBTuner via ADBTuner's Passthrough Channels feature.
These instructions are based on FastChannels version 5.2.2.
We will be enabling some unrelated functionality as it's required to unlock the m3u playlist needed by ADBTuner.
Note: these steps need to be completed in order. If you completed these tasks in a different order you may need to toggle "Bridge Mode" on and off to unlock this playlist.
This assumes that you have taken care of the setup steps specified on the home screen of FastChannels (Channels DVR URL, time zone, etc). If you don't want to use this with Channels DVR you still have to put something in FastChannel's Channels DVR URL box (http://127.0.0.1), otherwise it won't work correctly.
-
Add a FastChannels Player source (we will use Vidaa for this example):
Navigate to the sources page (http://x.x.x.x:5523/admin/sources).
Search for "vidaa", toggle that source on and click "scrape now."
Wait until the scrape is complete. -
Enable these newly scraped channels:
Navigate to the channels page (http://x.x.x.x:5523/admin/channels).
Click the "review now" link (or just go tohttp://x.x.x.x:5523/admin/channels?review=pending).
On this screen enable the Vidaa channels you wish to use. -
Configure "Bridge Mode":
Navigate to the Bridge settings page (http://x.x.x.x:5523/admin/bridge)
Scroll down to "HDMI Capture"
Toggle on "Enable Hardware Capture"
Add an ip address for one of your android tv devices into the HDMI Capture Device IP box and click save.
Then click "Install FastChannels Player." This should install the FastChannels Player app on that device.
Add the IP address of each of your devices and repeat until they all have the app installed.
Leave one of the device IPs in the HDMI Capture Device IP box when you are done.
This field cannot be left blank.
Add a fake "fixed capture stream URL" (http://127.0.0.1 is fine) and click save
Scroll back to the top of the Bridge page and toggle on "Enable Bridge Mode"
In ADBTuner (20260913-5 or newer) complete the following steps.
- Add a Tuning Configuration for FastChannels Player
Navigate to Advanced -> Tuning Configurations (http://x.x.x.x:5592/ui/configurations)
Click New Configuration, paste in the following (replace what's in the box) and click "Save Configuration"
{
"name": "FastChannels Player",
"description": "",
"author": "",
"version": "",
"uuid": "103f3173-d7a5-46a0-91d0-6eb42709caf9",
"global_options": {
"wait_for_video_playback_detection": true,
"use_fixed_delay": false
},
"pre_tune_commands": [],
"tune_commands": [
{
"HTTP": {
"method": "GET",
"action": "||TARGET_URL_OR_IDENTIFIER||?adb=||TARGET_DEVICE_IP_ADDRESS||:5555",
"timeout": 30
}
},
{
"WAIT_FOR_FOCUS": {
"package_name": "||TARGET_PACKAGE_NAME||"
}
}
],
"tune_match_text_commands": [],
"post_playback_start_commands": [],
"post_tune_commands": [
"am start -n com.fastchannels.player/.PlaybackActivity --es command warm_stop",
"input keyevent KEYCODE_HOME"
],
"timed_keep_active_commands": []
}
- Add a Passthrough Channels configuration
Navigate to Advanced -> Passthrough Channels (http://x.x.x.x:5592/ui/passthrough-channels)
Click Add Passthrough Channel List and enter the following:
Name: FastChannels
M3U URL:
http://x.x.x.x:5523/m3u/fc-player
(this should be the ip address of your FastChannels installation)
Package Name:
com.fastchannels.player
Configuration:
Your Configurations -> FastChannels Player
Click "Add Passthrough Channel List"
Setup Channels DVR
- On the main page in ADBTuner, click "Additional Playlists" and make note of the items listed.
- In the Channels DVR web admin, under sources, select your existing ADBTuner source (or add a new one) and set the URL to the "All Channels except passthrough" URL provided in the ADBTuner admin (ex.
http://x.x.x.x:5592/channels.m3u8?passthrough=false). Click "Save." - Add a new source, name it ADBTuner FastChannels and enter the FastChannels playlist URL from ADBTuner (ex. http://x.x.x.x:5592/channels.m3u8?provider=FastChannels), Enter the EPG link from FastChannels under XMLTV Guide Data (Feeds tab in FastChannels, ex
http://x.x.x.x:5523/feeds/default/epg.xml). Click "Save."
The m3u playlists are cached in ADBTuner for up to 5 minutes and will be automatically refreshed the next time one is requested. If you need to refresh sooner there is a refresh button in the Passthrough Channel List page in ADBTuner.
If you run into any issues please post them here. Thanks!
A big thanks to @babsonnexus for taking the time to test and provide feedback.
I completed some additional testing in 20260913-7 parsing through PLM's Fallback Feeds, into Channels, and doing an extended play (2 hours). I believe everything went fine from an ADBTuner perspective and I have no additional notes from a functionality perspective.
However, there was an issue on the FastChannels side where after 85 minutes it actually got knocked out and the stream in the FC Player just turned black. ADBTuner didn't know anything went wrong, so it just kept transmitting until the end. So I guess this is a question of how involved you want to get into this, but here's what I'm thinking: Could ADBTuner consider something like xxx number of seconds of pure black screen to be a failure, both during launch and checking in occasionally during playback? Obviously, a few seconds of black screen is pretty common, so wouldn't want it to trigger too soon. Or is there some type of health check that could be done against FC Player to make sure it is actually transmitting some activity? Understand if you don't want to get this nuanced with it and just consider it like all other sources that must work on their own.
Something about the "Vidaa" streams causes the FastPlayer app on Android to throw an exception and crash. It seems to happen every time. Sometimes after 5 minutes, sometimes after an hour. I'm not sure what can be done about that.
I'm looking into a general feature that would try to detect playback failure and optionally trigger an action if one is detected. As you suggested, this might not be doable across the board as the things that might signal failed playback (black screen, silence, still frame, etc.) can often exist in a working stream. It would really be too much if we had to get into defining this on a per-app basis.
The current development build (20260914-1) includes some checks for this, but they are just being logged in the activity log for now so we can see if it's generating false positives during normal viewing.
I'll fix that piece on FC side.
I’m seeing this issue while attempting to record using ADBTuner/FruitDeepLinks in a scheduled recording. These are not from a pass but a manually scheduled recording. I normally schedule about 2 days out and that has worked flawlessly until recently. In this case, when I scheduled it was slated for ESPN 261. The tuner does what it was asked and attempts to record on 261; the issue is that the game has switched to 211.
I’m going to try and set an advanced pass and see if that allievates the issue. Any other potential checks that I can do?
incorrect tune
2026-09-15T23:30:00.421153533Z 2026-09-15 23:30:00.420 - stream - [Tune Yyxwj8cRVeqjM2N78vQpfA] 10.0.1.65:5592 | channels-dvr/2026.09.14.0210 Go-http-client/1.1 (linux-x86_64)
2026-09-15T23:30:00.564268007Z 2026-09-15 23:30:00.564 - stream - [Tune (Yyxwj8cRVeqjM2N78vQpfA)] No active tuners found for ESPN 261. Reserving a new tuner.
2026-09-15T23:30:00.565362396Z 2026-09-15 23:30:00.565 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Attempting to reserve tuner for: ['com.espn.gtv', 'com.espn.score_center'].
2026-09-15T23:30:00.572019863Z 2026-09-15 23:30:00.571 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Available Tuners:
2026-09-15T23:30:00.572392404Z 2026-09-15 23:30:00.572 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Name: Encoder 4 Priority: 1
2026-09-15T23:30:00.572639330Z 2026-09-15 23:30:00.572 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Name: Encoder 5 Priority: 2
2026-09-15T23:30:00.572760183Z 2026-09-15 23:30:00.572 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Name: ONN Priority: 3
2026-09-15T23:30:00.572822503Z 2026-09-15 23:30:00.572 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Using first available tuner (by priority).
2026-09-15T23:30:00.573452515Z 2026-09-15 23:30:00.572 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Reserved Tuner: Name: Encoder 4 Priority: 1
2026-09-15T23:30:00.573955540Z 2026-09-15 23:30:00.573 - stream - [Tune (Yyxwj8cRVeqjM2N78vQpfA)] Tuning to ESPN 261 on Encoder 4
2026-09-15T23:30:00.652125296Z 2026-09-15 23:30:00.651 - stream - [Tune (Yyxwj8cRVeqjM2N78vQpfA)] Using channel configuration: FruitDeepLinks - ESPN+ v2.0 (FireTV and AndroidTV) (bnhf) (51af5028-092f-4ddc-b4ea-d5e5fca58cac)
2026-09-15T23:30:01.409140297Z 2026-09-15 23:30:01.408 - stream - [Tune Yyxwj8cRVeqjM2N78vQpfA] MPEG null packets mode: Redirecting immediately to /proxy/5?requestKey=Yyxwj8cRVeqjM2N78vQpfA
2026-09-15T23:30:01.383238274Z 2026/09/15 23:30:01 [PROXY] Registered pending stream for key Yyxwj8cRVeqjM2N78vQpfA
2026-09-15T23:30:01.409872835Z 2026-09-15 23:30:01.409 - uvicorn.access - 172.22.0.1:0 - "GET /stream/261 HTTP/1.1" 307
2026-09-15T23:30:01.434977765Z 2026/09/15 23:30:01 [PROXY] 172.22.0.1 -> GET "/proxy/5?requestKey=Yyxwj8cRVeqjM2N78vQpfA" -> "http://10.0.1.34:8090/stream3"
2026-09-15T23:30:01.435135403Z 2026/09/15 23:30:01 [PROXY] Starting null packet stream for key Yyxwj8cRVeqjM2N78vQpfA
2026-09-15T23:30:01.489618693Z 2026-09-15 23:30:01.489 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - input keyevent KEYCODE_WAKEUP
2026-09-15T23:30:04.141411309Z 2026-09-15 23:30:04.141 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - pidof com.espn.gtv
2026-09-15T23:30:04.480630447Z 2026-09-15 23:30:04.475 - tuning - [Tune (Yyxwj8cRVeqjM2N78vQpfA)] Resolving dynamic URL (http://10.0.1.65:6655/api/adb/lanes/sportscenter/261/deeplink?format=json) for channel.
2026-09-15T23:30:05.201194990Z 2026-09-15 23:30:05.200 - tuning - [Tune (Yyxwj8cRVeqjM2N78vQpfA)] Retrieved dynamic URL data: {'deeplink': None, 'lane_number': 261, 'message': 'No event scheduled at this time', 'provider_code': 'sportscenter', 'status': 'success', 'title': None}
2026-09-15T23:30:05.201576998Z 2026-09-15 23:30:05.201 - tuning - [Tune (Yyxwj8cRVeqjM2N78vQpfA)] Using http://10.0.1.65:6655/api/adb/lanes/sportscenter/261/deeplink?format=json&dynamic_url_json_key=deeplink to load channel.
2026-09-15T23:30:05.202074866Z 2026-09-15 23:30:05.201 - tuning - [Tune (Yyxwj8cRVeqjM2N78vQpfA)] Executing pre-tune commands: [{'type': 'ADB', 'command': 'input keyevent KEYCODE_MEDIA_STOP'}]
2026-09-15T23:30:05.202184899Z 2026-09-15 23:30:05.202 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - input keyevent KEYCODE_MEDIA_STOP
2026-09-15T23:30:05.376919454Z 2026-09-15 23:30:05.374 - tuning - [Tune Yyxwj8cRVeqjM2N78vQpfA] Fixed delay (5s) elapsed; starting real stream.
2026-09-15T23:30:06.436124230Z 2026/09/15 23:30:06 [PROXY] Sending null packets for key Yyxwj8cRVeqjM2N78vQpfA (5.001s elapsed, 65800 bytes sent)
2026-09-15T23:30:06.483825676Z 2026/09/15 23:30:06 [PROXY] Switching to real stream for key Yyxwj8cRVeqjM2N78vQpfA after 5.049s (50 batches sent)
2026-09-15T23:30:06.483426790Z 2026/09/15 23:30:06 [PROXY] Signaled stream start for key Yyxwj8cRVeqjM2N78vQpfA
2026-09-15T23:30:07.034680364Z 2026/09/15 23:30:07 [PROXY] No keyframe found within 500ms for key Yyxwj8cRVeqjM2N78vQpfA (38540 bytes buffered), flushing buffer
2026-09-15T23:30:06.483887990Z 2026/09/15 23:30:06 [PROXY] Beginning reverse proxy for key Yyxwj8cRVeqjM2N78vQpfA
2026-09-15T23:30:08.255563147Z 2026-09-15 23:30:08.255 - tuning - [Tune (Yyxwj8cRVeqjM2N78vQpfA)] Executing tune commands: [{'type': 'ADB', 'command': "am start -n 'com.espn.gtv'/com.espn.startup.presentation.StartupActivity -d 'http://10.0.1.65:6655/api/adb/lanes/sportscenter/261/deeplink?format=json&dynamic_url_json_key=deeplink'"}]
2026-09-15T23:30:07.376287613Z 2026-09-15 23:30:07.375 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - reconnected after a dropped connection.
2026-09-15T23:30:08.256156824Z 2026-09-15 23:30:08.255 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - am start -n 'com.espn.gtv'/com.espn.startup.presentation.StartupActivity -d 'http://10.0.1.65:6655/api/adb/lanes/sportscenter/261/deeplink?format=json&dynamic_url_json_key=deeplink'
2026-09-15T23:30:08.350439408Z 2026-09-15 23:30:08.350 - tuning - [Tune Yyxwj8cRVeqjM2N78vQpfA] Waiting 3 seconds to allow sleeping device to setup.
2026-09-15T23:30:16.355176212Z 2026-09-15 23:30:16.354 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - sleep 20
2026-09-15T23:30:16.418823156Z 2026-09-15 23:30:16.418 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: Sleeping for 20.0 seconds.
2026-09-15T23:30:24.628643474Z 2026-09-15 23:30:24.628 - server -
2026-09-15T23:30:24.629173051Z Tuner "Encoder 4" is currently in use and locked.
2026-09-15T23:30:24.629142926Z --------------------------------------------------
2026-09-15T23:30:24.629106726Z
2026-09-15T23:30:24.629222667Z Tune ID: Yyxwj8cRVeqjM2N78vQpfA
2026-09-15T23:30:24.629251134Z Channel: ESPN 261
2026-09-15T23:30:24.629278210Z Lock Obtained: 2026-09-15 23:30:00 (0.41 minutes ago)
2026-09-15T23:30:24.629344878Z Bytes Transferred: 4357464 (4.16MB)
2026-09-15T23:30:24.629312404Z Last Seen: 2026-09-15 23:30:24 (0.63 seconds ago)
2026-09-15T23:30:24.629373210Z Remote User Agent:
2026-09-15T23:30:24.629399179Z channels-dvr/2026.09.14.0210 Go-http-client/1.1
2026-09-15T23:30:24.629453012Z --------------------------------------------------
2026-09-15T23:30:24.629428880Z (linux-x86_64)
2026-09-15T23:30:36.419380449Z 2026-09-15 23:30:36.418 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - input keyevent KEYCODE_DPAD_DOWN
2026-09-15T23:30:37.795505737Z 2026-09-15 23:30:37.795 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - sleep 1
2026-09-15T23:30:37.795655246Z 2026-09-15 23:30:37.795 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: Sleeping for 1.0 seconds.
2026-09-15T23:30:38.796415531Z 2026-09-15 23:30:38.795 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - input keyevent KEYCODE_DPAD_DOWN
2026-09-15T23:30:39.693650756Z 2026-09-15 23:30:39.693 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - sleep 1
2026-09-15T23:30:39.693806097Z 2026-09-15 23:30:39.693 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: Sleeping for 1.0 seconds.
2026-09-15T23:30:40.697053161Z 2026-09-15 23:30:40.696 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - input keyevent KEYCODE_DPAD_RIGHT
2026-09-15T23:30:41.573382405Z 2026-09-15 23:30:41.573 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - sleep 1
2026-09-15T23:30:41.573543871Z 2026-09-15 23:30:41.573 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: Sleeping for 1.0 seconds.
2026-09-15T23:30:42.573789894Z 2026-09-15 23:30:42.573 - lib.adb - [Tune Yyxwj8cRVeqjM2N78vQpfA] ADB: 10.0.1.54 - input keyevent KEYCODE_DPAD_CENTER
2026-09-15T23:30:43.507537060Z 2026-09-15 23:30:43.506 - tuning - [Tune Yyxwj8cRVeqjM2N78vQpfA] Tuning completed after 43.14 seconds. Display was off, application (com.espn.gtv) was closed.
2026-09-15T23:30:54.650029714Z 2026-09-15 23:30:54.649 - server -
2026-09-15T23:30:54.650775862Z Tune ID: Yyxwj8cRVeqjM2N78vQpfA
2026-09-15T23:30:54.650738652Z Tuner "Encoder 4" is currently in use and locked.
2026-09-15T23:30:54.650709156Z --------------------------------------------------
2026-09-15T23:30:54.650660476Z
2026-09-15T23:30:54.650834179Z Lock Obtained: 2026-09-15 23:30:00 (0.91 minutes ago)
2026-09-15T23:30:54.650805119Z Channel: ESPN 261
2026-09-15T23:30:54.650902190Z Bytes Transferred: 8770388 (8.36MB)
2026-09-15T23:30:54.650867173Z Last Seen: 2026-09-15 23:30:54 (0.65 seconds ago)
2026-09-15T23:30:54.650931453Z Remote User Agent:
2026-09-15T23:30:54.650962239Z channels-dvr/2026.09.14.0210 Go-http-client/1.1
2026-09-15T23:31:24.700623833Z 2026-09-15 23:31:24.700 - server -
2026-09-15T23:30:54.651017893Z --------------------------------------------------
2026-09-15T23:31:24.701199539Z
2026-09-15T23:31:24.701447673Z Remote User Agent:
2026-09-15T23:30:54.650992297Z (linux-x86_64)
Correct tune:
2026-09-15T23:51:45.873855838Z 2026-09-15 23:51:45.873 - stream - [Tune ByEKpLe8UPriUDzENiUacR] 10.0.1.65:5592 | channels-dvr/2026.09.14.0210 Go-http-client/1.1 (linux-x86_64)
2026-09-15T23:51:45.886290245Z 2026-09-15 23:51:45.886 - stream - [Tune (ByEKpLe8UPriUDzENiUacR)] No active tuners found for ESPN 211. Reserving a new tuner.
2026-09-15T23:51:45.886721077Z 2026-09-15 23:51:45.886 - tuner_management - [Tune ByEKpLe8UPriUDzENiUacR] Attempting to reserve tuner for: ['com.espn.gtv', 'com.espn.score_center'].
2026-09-15T23:51:45.889489311Z 2026-09-15 23:51:45.889 - tuner_management - [Tune ByEKpLe8UPriUDzENiUacR] Available Tuners:
2026-09-15T23:51:45.889676229Z 2026-09-15 23:51:45.889 - tuner_management - [Tune ByEKpLe8UPriUDzENiUacR] Name: Encoder 5 Priority: 2
2026-09-15T23:51:45.889722040Z 2026-09-15 23:51:45.889 - tuner_management - [Tune ByEKpLe8UPriUDzENiUacR] Name: ONN Priority: 3
2026-09-15T23:51:45.889755538Z 2026-09-15 23:51:45.889 - tuner_management - [Tune ByEKpLe8UPriUDzENiUacR] Using first available tuner (by priority).
2026-09-15T23:51:45.889827107Z 2026-09-15 23:51:45.889 - tuner_management - [Tune ByEKpLe8UPriUDzENiUacR] Reserved Tuner: Name: Encoder 5 Priority: 2
2026-09-15T23:51:45.889911180Z 2026-09-15 23:51:45.889 - stream - [Tune (ByEKpLe8UPriUDzENiUacR)] Tuning to ESPN 211 on Encoder 5
2026-09-15T23:51:45.916227915Z 2026-09-15 23:51:45.916 - stream - [Tune (ByEKpLe8UPriUDzENiUacR)] Using channel configuration: FruitDeepLinks - ESPN+ v2.0 (FireTV and AndroidTV) (bnhf) (51af5028-092f-4ddc-b4ea-d5e5fca58cac)
2026-09-15T23:51:46.156116128Z 2026/09/15 23:51:46 [PROXY] Registered pending stream for key ByEKpLe8UPriUDzENiUacR
2026-09-15T23:51:46.157690294Z 2026-09-15 23:51:46.157 - stream - [Tune ByEKpLe8UPriUDzENiUacR] MPEG null packets mode: Redirecting immediately to /proxy/6?requestKey=ByEKpLe8UPriUDzENiUacR
2026-09-15T23:51:46.227517643Z 2026-09-15 23:51:46.158 - uvicorn.access - 172.22.0.1:0 - "GET /stream/211 HTTP/1.1" 307
2026-09-15T23:51:46.227564581Z 2026-09-15 23:51:46.225 - lib.adb - [Tune ByEKpLe8UPriUDzENiUacR] ADB: 10.0.1.51 - input keyevent KEYCODE_WAKEUP
2026-09-15T23:51:46.227609762Z 2026/09/15 23:51:46 [PROXY] 172.22.0.1 -> GET "/proxy/6?requestKey=ByEKpLe8UPriUDzENiUacR" -> "http://10.0.1.34:8090/stream4"
2026-09-15T23:51:46.227655390Z 2026/09/15 23:51:46 [PROXY] Starting null packet stream for key ByEKpLe8UPriUDzENiUacR
2026-09-15T23:51:48.215219770Z 2026-09-15 23:51:48.214 - lib.adb - [Tune ByEKpLe8UPriUDzENiUacR] ADB: 10.0.1.51 - pidof com.espn.gtv
2026-09-15T23:51:48.411044414Z 2026-09-15 23:51:48.410 - tuning - [Tune (ByEKpLe8UPriUDzENiUacR)] Resolving dynamic URL (http://10.0.1.65:6655/api/adb/lanes/sportscenter/211/deeplink?format=json) for channel.
2026-09-15T23:51:49.019212384Z 2026-09-15 23:51:49.018 - tuning - [Tune (ByEKpLe8UPriUDzENiUacR)] Retrieved dynamic URL data: {'channel_id': 'sportscenter211', 'channel_name': 'ESPN+ V2', 'deeplink': 'sportscenter://x-callback-url/showWatchStream?playID=bf6e551b-7608-4b0d-b867-b8357f507e9f', 'deeplink_format': 'scheme', 'event_end_utc': '2026-09-16T01:35:00+00:00', 'event_start_utc': '2026-09-15T23:30:00+00:00', 'lane_number': 211, 'provider_code': 'sportscenter', 'start_utc': '2026-09-15T23:30:00+00:00', 'status': 'success', 'stop_utc': '2026-09-16T01:35:00+00:00', 'title': "Women's College Volleyball: Louisiana Ragin' Cajuns at Southeastern Louisiana Lions"}
2026-09-15T23:51:49.019503274Z 2026-09-15 23:51:49.018 - tuning - [Tune (ByEKpLe8UPriUDzENiUacR)] Using sportscenter://x-callback-url/showWatchStream?playID=bf6e551b-7608-4b0d-b867-b8357f507e9f to load channel.
2026-09-15T23:51:49.019566194Z 2026-09-15 23:51:49.019 - tuning - [Tune (ByEKpLe8UPriUDzENiUacR)] Executing pre-tune commands: [{'type': 'ADB', 'command': 'input keyevent KEYCODE_MEDIA_STOP'}]
2026-09-15T23:51:49.019709313Z 2026-09-15 23:51:49.019 - lib.adb - [Tune ByEKpLe8UPriUDzENiUacR] ADB: 10.0.1.51 - input keyevent KEYCODE_MEDIA_STOP
2026-09-15T23:51:50.880946905Z 2026-09-15 23:51:50.880 - tuning - [Tune ByEKpLe8UPriUDzENiUacR] Fixed delay (5s) elapsed; starting real stream.
2026-09-15T23:51:51.012136733Z 2026-09-15 23:51:51.011 - tuning - [Tune (ByEKpLe8UPriUDzENiUacR)] Executing tune commands: [{'type': 'ADB', 'command': "am start -n 'com.espn.gtv'/com.espn.startup.presentation.StartupActivity -d 'sportscenter://x-callback-url/showWatchStream?playID=bf6e551b-7608-4b0d-b867-b8357f507e9f'"}]
2026-09-15T23:51:51.012380554Z 2026-09-15 23:51:51.012 - lib.adb - [Tune ByEKpLe8UPriUDzENiUacR] ADB: 10.0.1.51 - am start -n 'com.espn.gtv'/com.espn.startup.presentation.StartupActivity -d 'sportscenter://x-callback-url/showWatchStream?playID=bf6e551b-7608-4b0d-b867-b8357f507e9f'
2026-09-15T23:51:51.134061629Z 2026-09-15 23:51:51.133 - tuning - [Tune ByEKpLe8UPriUDzENiUacR] Waiting 3 seconds to allow sleeping device to setup.
2026-09-15T23:51:51.208296696Z 2026/09/15 23:51:51 [PROXY] Sending null packets for key ByEKpLe8UPriUDzENiUacR (5.001s elapsed, 65800 bytes sent)
2026-09-15T23:51:51.213044783Z 2026-09-15 23:51:51.212 - tuner_management - Releasing tuner 5 as it has been inactive for 10 seconds.
2026-09-15T23:51:51.213240187Z 2026-09-15 23:51:51.213 - tuner_management - Releasing tuner: {'lock_obtained': 1789515000, 'tuner_name': 'Encoder 4', 'name': 'ESPN 261', 'number': 260, 'provider_name': 'sportscenter', 'tuner_id': 5, 'channel_id': 261, 'url_or_identifier': 'http://10.0.1.65:6655/api/adb/lanes/sportscenter/261/deeplink?format=json&dynamic_url_json_key=deeplink', 'tuning_status': 'tuned', 'request_key': 'Yyxwj8cRVeqjM2N78vQpfA', 'target_package': 'com.espn.gtv'}
2026-09-15T23:51:51.366857495Z 2026/09/15 23:51:51 [PROXY] Switching to real stream for key ByEKpLe8UPriUDzENiUacR after 5.16s (51 batches sent)
2026-09-15T23:51:51.366515625Z 2026/09/15 23:51:51 [PROXY] Signaled stream start for key ByEKpLe8UPriUDzENiUacR
2026-09-15T23:51:51.366984286Z 2026/09/15 23:51:51 [PROXY] Beginning reverse proxy for key ByEKpLe8UPriUDzENiUacR
2026-09-15T23:51:51.930678359Z 2026/09/15 23:51:51 [PROXY] No keyframe found within 500ms for key ByEKpLe8UPriUDzENiUacR (313020 bytes buffered), flushing buffer
2026-09-15T23:51:51.950034752Z 2026-09-15 23:51:51.949 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Using configuration: FruitDeepLinks - ESPN+ v2.0 (FireTV and AndroidTV) (bnhf) (51af5028-092f-4ddc-b4ea-d5e5fca58cac) for channel cleanup.
2026-09-15T23:51:51.950327019Z 2026-09-15 23:51:51.950 - tuner_management - Post tune commands: [{'type': 'ADB', 'command': 'input keyevent KEYCODE_MEDIA_STOP'}, {'type': 'ADB', 'command': 'input keyevent KEYCODE_MEDIA_PAUSE'}, {'type': 'ADB', 'command': 'input keyevent KEYCODE_HOME'}]
2026-09-15T23:51:55.691342684Z 2026-09-15 23:51:55.691 - server -
2026-09-15T23:51:54.787353228Z 2026-09-15 23:51:54.786 - lib.adb - [Pool 5] ADB: 10.0.1.54 - input keyevent KEYCODE_HOME
2026-09-15T23:51:53.596599603Z 2026-09-15 23:51:53.596 - lib.adb - [Pool 5] ADB: 10.0.1.54 - input keyevent KEYCODE_MEDIA_PAUSE
2026-09-15T23:51:51.950504246Z 2026-09-15 23:51:51.950 - lib.adb - [Pool 5] ADB: 10.0.1.54 - input keyevent KEYCODE_MEDIA_STOP
2026-09-15T23:51:55.691492187Z
2026-09-15T23:51:55.691542047Z Tuner "Encoder 4" is currently in use and locked.
2026-09-15T23:51:55.691518612Z --------------------------------------------------
2026-09-15T23:51:55.691574627Z Tune ID: Yyxwj8cRVeqjM2N78vQpfA
2026-09-15T23:51:55.691630095Z Lock Obtained: 2026-09-15 23:30:00 (21.93 minutes ago)
2026-09-15T23:51:55.691598874Z Channel: ESPN 261
2026-09-15T23:51:55.691690785Z Bytes Transferred: 616785888 (588.21MB)
2026-09-15T23:51:55.691661527Z Last Seen: 2026-09-15 23:51:41 (14.69 seconds ago)
2026-09-15T23:51:55.691718616Z Remote User Agent:
2026-09-15T23:51:55.691743885Z channels-dvr/2026.09.14.0210 Go-http-client/1.1
2026-09-15T23:51:55.691772358Z (linux-x86_64)
2026-09-15T23:51:55.691860140Z Tuner "Encoder 5" is currently in use and locked.
2026-09-15T23:51:55.691838807Z --------------------------------------------------
2026-09-15T23:51:55.691818662Z
2026-09-15T23:51:55.691797383Z --------------------------------------------------
2026-09-15T23:51:55.691885547Z Tune ID: ByEKpLe8UPriUDzENiUacR
2026-09-15T23:51:55.691908343Z Channel: ESPN 211
2026-09-15T23:51:55.691940129Z Lock Obtained: 2026-09-15 23:51:45 (0.18 minutes ago)
2026-09-15T23:51:55.691966318Z Last Seen: 2026-09-15 23:51:55 (0.69 seconds ago)
2026-09-15T23:51:55.691993867Z Bytes Transferred: 864424 (0.82MB)
2026-09-15T23:51:55.692039440Z channels-dvr/2026.09.14.0210 Go-http-client/1.1
2026-09-15T23:51:55.692065862Z (linux-x86_64)
2026-09-15T23:51:55.692087777Z --------------------------------------------------
2026-09-15T23:51:55.692017457Z Remote User Agent:
2026-09-15T23:51:57.664416972Z 2026-09-15 23:51:57.664 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Released tuner (5).
2026-09-15T23:51:57.664952470Z 2026-09-15 23:51:57.664 - tuner_management - [Tune Yyxwj8cRVeqjM2N78vQpfA] Cleanup complete. Encoder 4 (ESPN 261)
Well, I've come a long way in my ADBTuner journey. Now I'm deep into understanding the nuances with the integration with Channels. I have some questions about maintenance and channel updates. I'll start with this one... Every time I upload a channel update (even if only a Gracenote ID change), my collections get stomped on and I have to rebuild it from scratch (see image below). Is this a Channels thing or an ADBTuner thing (or an operator headspace thing.
). What can I do to stop this?
Kind of all of the above. Channels follows uniqueness that is used in Channels Collections and elsewhere by the channel-id tag in the m3u playlist:
Assuming you are loading ADBTuner -> Channels DVR directly, something you are doing in ADBTuner is most likely causing the channel-ids to reset to a new value. There's not much details with what you've provided, but if you are deleting the stations and re-adding or changing certain things about them, you could be causing a change to this tag. It must be maintained for identification, and they must all be unique.
To deal with this, I also highly recommend parsing ADBTuner and all other sources like FAST stations through Playlist Manger for Channels as it will eliminate this exact situation by always having a unique and consistent channel-id for a Parent station. Yours was my exact use case where I didn't want to care anymore about what the source was and just wanted my Channel Collections to stay still without any manual maintenance.
Aha! There's my misunderstanding. Thank you, @babsonnexus. I thought the uniqueness was the "tvc-guide-stationid". So this issue definitely comes from how I've been updating ADBTuner channels.
So this leads me to another question: Does Channels match "channel-id" or "tvc-guide-stationid" to match them as the same channel when there are multiple sources with the same channel? I used to think it was "tvc-guide-stationid". But my experience has been mixed when I combine ADBTuner sources with TVE sources.
Ultimately, I want to use YouTube TV during college football season, then go back to Philo afterwards. Both using TVE for the channels that still work with it, and ADBTuner channels for non-TVE channels. Big bonus is if I don't have to re-create collections every time I go back and forth. Right now, they aren't playing nice together.
Is that something that PLM can facilitate? I see you have a video for it. I'll watch it tonight. But knowing you think it is possible will give me more motivation to proceed further. 
The tvc-guide-stationid is the Gracenote ID, so it will give them the same guide data. You can have different stations with uniqueness by the channel-id with the same guide data, although usually that's unnecessary.
Yes, because PLM always has it's same "Parent" with it's own unique channel-id, it doesn't care what the underlying "Child" or "Children" stations are. Take for instance this situation with HGTV:
My default choice is to use Channels TVE through Cox/Spectrum. If that fails, it can fallback to FastChannels TVE through the same providers. If that fails, then it launches ADBTuner using HDMI Encoder Native Apps. If that fails or all my ADBTuner tuners are taken, it falls back to Roku Bridge. Finally, if that is not available, it will use PrismCast. If I had another provider like Philo or YouTube TV, I could shove them anywhere in that chain, and disable them when they're not in use and PLM would skip over them. Meanwhile, as far a Channels is concerned, it is the same HGTV with the same channel-id, so it always stays put in my Channels Collection.
This sounds awesome. I will give it a try... after I get back from a desperately needed vacation.
I'll let you know how it goes. Thanks again.







