FruitDeepLinks — Universal Sports Aggregator for Channels DVR

For those of us who are using this tool for ADBTuner tuning, if you haven't discovered the most recent development version of ADBTuner, I highly recommend. The developer has expanded out the historical "who's watching?" capability, so that you now may put in custom search terms beyond the native ones. This is very handy as a way to get past all of the "watch live" type splash screens that can be encountered by all of the live events across the various apps now supported by FDL. The short version of this is that you can add search terms such as "live" or "watch" and it will keep periodically pushing the DPAD_CENTER button until it detects that you are all the way to live video. It is really nice doing things this way, for me, because you can fold back in some of the native detect live video tools that are built into ADBTuner, and everything doesn't have to be so timing based as the custom configs first being used here with FDL. Some of these timings were set quite long because how quickly an app can open can vary quite a bit. Plus this approach hides more of the sausage being made, which I prefer as well.

I started using this development version, and was making a bunch of different configs, discovering the right search terms per app, and eventually found that a couple of key search terms covered a lot of different apps. So I consolidated them, and they have been working quite successfully for a while now for me, so I thought I would share to save others the trouble.

There are two main configs I made. A standard one that would support many apps, and then a compatibility one. A decent amount of the apps supported here don't close properly, so I had to make a compatibility version, so apps would be forced closed, similar to the compatibility version in ADBTuner. Between these two, I was able to make them work with a lot of different apps supported with FDL.

There were two apps that still couldn't be supported with these, as they didn't consistently, go to the live version of the event when tuning through FDL, the ESPN app, and the NBA app. Some configs for ESPN have been shared previously in this thread, but for me I prefer mine, because it is leveraging some of the video detection aspects of ADBTuner, doesn't seem to be so timing based, and less sausage-makey. The NBA one was tricky to always get to live, as the app wants to throw a lot of different looks where buttons can be found on the screen, etc. But eventually I think I have discovered the proper sorcery of button pushes to consistently get you to live.

I will share all four of these below. I currently use FDL Standard for HBO Max. I use FDL Compatibility for Prime Video, Peacock, and Paramount+. I use FDL ESPN Specific for ESPN, and FDL NBA Specific for NBA of course. The "Specific" ones still potentially have a little bit of timing basis to them, as there is a lot of button pushing required, and I tuned them for my personal use on one specific type of hardware, so it is possible you may have to stretch out some of the initial timings if your hardware is different then mine. I don't like to wait forever, so I tried to time them decent for my stuff, so YMMV there. Enjoy!

    "name": "FDL Standard",
    "author": "nateg",
    "version": "1.0",
    "description": "FruitDeepLinks standard config with tuning to the Live feed.",
    "uuid": "38a8a0df-23b2-41cc-88a5-35ee114eb76b",
    "global_options": {
        "wait_for_video_playback_detection": true,
        "use_fixed_delay": false,
        "fixed_delay_seconds": 0,
        "wait_after_post_playback_start_commands_seconds": 0
    },
    "pre_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP"
    ],
    "tune_commands": [
        "am start -W -a android.intent.action.VIEW -d '||TARGET_URL_OR_IDENTIFIER||' '||TARGET_PACKAGE_NAME||'"
    ],
    "tune_match_text_commands": [
        {
            "match_text": [
                "who's watching",
                "choose an account",
                "edit profiles",
                "watch",
                "live"
            ],
            "commands": [
                "input keyevent KEYCODE_DPAD_CENTER"
            ],
            "start_checking_after_seconds": 5
        }
    ],
    "post_playback_start_commands": [],
    "post_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP",
        "input keyevent KEYCODE_MEDIA_PAUSE"
    ],
    "timed_keep_active_commands": []
}
{
    "name": "FDL Compatibility",
    "author": "nateg",
    "version": "1.0",
    "description": "FruitDeepLinks compatibility config with tuning to the live feed.",
    "uuid": "40c81359-f241-4c63-af69-bbd76208b065",
    "global_options": {
        "wait_for_video_playback_detection": true,
        "use_fixed_delay": false,
        "fixed_delay_seconds": 0,
        "wait_after_post_playback_start_commands_seconds": 0
    },
    "pre_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP",
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "sleep 1"
    ],
    "tune_commands": [
        "am start -W -a android.intent.action.VIEW -d '||TARGET_URL_OR_IDENTIFIER||' '||TARGET_PACKAGE_NAME||'"
    ],
    "tune_match_text_commands": [
        {
            "match_text": [
                "who's watching",
                "choose an account",
                "edit profiles",
                "watch",
                "live"
            ],
            "commands": [
                "input keyevent KEYCODE_DPAD_CENTER"
            ],
            "start_checking_after_seconds": 5
        }
    ],
    "post_playback_start_commands": [],
    "post_tune_commands": [
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "input keyevent KEYCODE_HOME"
    ]
}
{
    "name": "FDL ESPN Specific",
    "author": "nateg",
    "version": "1.0",
    "description": "ESPN for FruitDeepLinks with tuning to live feed.",
    "uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac",
    "global_options": {
        "wait_for_video_playback_detection": true,
        "use_fixed_delay": false,
        "fixed_delay_seconds": 0,
        "wait_after_post_playback_start_commands_seconds": 0
    },
    "pre_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP"
    ],
    "tune_commands": [
        "am start -W -a android.intent.action.VIEW -d '||TARGET_URL_OR_IDENTIFIER||' '||TARGET_PACKAGE_NAME||'"
    ],
    "post_playback_start_commands": [
        "sleep 10",
        "input keyevent KEYCODE_DPAD_DOWN",
        "sleep 1",
        "input keyevent KEYCODE_DPAD_DOWN",
        "input keyevent KEYCODE_DPAD_RIGHT",
        "input keyevent KEYCODE_DPAD_CENTER"
    ],
    "post_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP",
        "input keyevent KEYCODE_MEDIA_PAUSE",
        "input keyevent KEYCODE_HOME"
    ]
}
{
    "name": "FDL NBA Specific",
    "author": "nateg",
    "version": "1.0",
    "description": "NBA for FruitDeepLinks with tuning to live feed.",
    "uuid": "599c8090-0e83-4a75-9c8b-69494d1a2d75",
    "global_options": {
        "wait_for_video_playback_detection": true,
        "use_fixed_delay": true,
        "fixed_delay_seconds": 9,
        "wait_after_post_playback_start_commands_seconds": 0
    },
    "pre_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP",
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "sleep 1"
    ],
    "tune_commands": [
        "am start -W -a android.intent.action.VIEW -d '||TARGET_URL_OR_IDENTIFIER||' '||TARGET_PACKAGE_NAME||'"
    ],
    "post_playback_start_commands": [
        "input keyevent KEYCODE_DPAD_CENTER",
        "sleep 13",
        "input keyevent KEYCODE_DPAD_DOWN",
        "sleep 1",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "sleep 1",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "sleep 2”,
        "input keyevent KEYCODE_DPAD_DOWN",
        "input keyevent KEYCODE_DPAD_CENTER"
    ],
    "post_tune_commands": [
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "input keyevent KEYCODE_HOME"
    ]
}
4 Likes

N00b questions/issues:

Despite suggestions that I use Project One-Click (which I'm resisting because I want to understand how it's all supposed to work before I take the easy way out), I've manually used Portainer to build the stack per the instructions in the READ.ME on the repo.

[NOTE: the URLs to put in the Custom Channel in Channels DVR are of the form: http://your-server-ip:6655/direct.m3u . This URL is missing an "/out" on both of them. I mention this for doc update. In fact, you might wish to suggest copy/paste from the Output Files tile of the Dashboard ]

It's up, and running. I created both Sources in Channels DVR. It's showing events in Channels Guide for both sources (though the channel titles are blowing through the size of the box allocated for that in the guide for the direct sourced channels).

In the web interface, I click on a showing and the event window pops up. I click "Watch now" and I get this flashing up 3 or 4 times, and then giving up

. This happens whether using the direct stream or the multisource_lanes stream.

I do have an ADBTuner container up and spinning. I have set up a tuner on it. However, I've set up no channels on it, nor done anything to tell it about Channels DVR or vice versa.

I'm thinking there's some glue missing somewhere in here between Channels, FruitDeepLinks and ADBTuner that I'm sure P1C would have just handled, but I wouldn't understand it and couldn't troubleshoot future issues. So, bear with me... what mistakes do you see for me to clean up?

Thanks!

UPDATE: I went to a TV with a Chromecast and selected a game from the direct list, and it loaded ESPN and the event at the beginning. I then tried the multisource and got "You don't have an app that can do this."

Though you have a number of issues, this one is probably because of a completely unrelated issue:

This is not actually true, using the Project One-Click approach will help you understand how all the pieces go together. Part of the reason for creating it, is so that each person does not need to be walked through the process, but rather can use an automated tool to see how it's done.

Here are the basics:

What Project One-Click would do for you, is to create x number of ADBTuner virtual channels for each app you want to use (ESPN, Amazon, NFL, NBA, etc). The URL used for each provider's virtual channels would use a structure that's designed to query FDL to get the actual URL for whatever event is currenlty playing in that lane.

Your CDVR Custom Channels Source (again something Project One-Click would do), would use ADBTuner as the M3U provider and FDL as the EPG provider:

This process has to be repeated for each app ADBTuner needs to use. X number of virtual channels created, and a CDVR Custom Channels Source that corresponds:

It's not unusual for the ADBTuner virtual channels to need ADBTuner custom tuning configurations for a given app. Project One-Click also takes care of this for you, offering certain ADBTuner Custom Configs:

When you're all done, you'll end up with multiple new CDVR Sources (which you can combine in a Channel Collection if you like), each tied to a specific app supported through ADBTuner:

You might consider thinking of the Project One-Click approach as being not unlike watching a YouTube video, or reading a step-by-step. In this case you'll gain that same knowledge, but end up with a functional setup at the end.

EDIT: Probably also worth mentioning the Project One-Click Action is design to be able to be run on as needed basis. So if you need to increase or remove the number of lanes (aka virtual channels) for a given app, or change the ADBTuner Custom Config for a given subset of virtual channels, this is done for you through the Action (as opposed to editing each channel manually -- with the inherent chance for human error involved).

Oh, all right. Fine. I'll install Olive Tin and Project-One-Click. As long as it gets along with what's already there.

There will still be plenty of chances to get your hands dirty. There's FDL setup to do (and get right), there's encoder configuration, and connected streaming stick setup (app logins and such). Plus review of everything that's been done by the Project One-Click Action. :slight_smile:

1 Like

A post was merged into an existing topic: OliveTin for Channels: An Interface for Misc Channels DVR Scripts & Tricks

Running FDL with ADBTuner the past few days.

Was watching (while recording) the LSU vs Northwestern baseball game. By the web guide, it was scheduled to go 3 hr 5 min. For my series pass, I extend for 30 minutes because games always go long. At the 3 hr 5 min point, it switches to the Iowa State vs Arizona Basketball game. It continues to record until I stop recording.

Is there a way to extend the FDL data by 30 or 60 minutes so games that are recording will finish up? Post padding for games would be nice.

Edit: I think I found it. I need to add an environment variable.

Question for the braintrust.

I have multiple Channel TV passes set up to record shows with a TeamID, e.g. 3898 SC Softball and 1846 SC Women's Basketball. Now that I have an ESPN lane set up in ADBTuner and FruitDeepLinks providing scheduling information, I'm seeing games in the schedule... but the Passes are not picking up these for recording (and recording these passes is the entire point of this expedition into DFL and ADBTuner.)

I pulled the JSON for one such game in DFL and looked for the teamid that should be in the JSON and it was not there, nor was there any other field that looked like it might be a teamid from some other source.... there is this ID "umc.cst.yg7hptch7dg690hbbhq6wtf9" in the competitors array element.

Obviously this was in the ESPN TVE feed information and it worked for the linear channel games but I'm not sure if it worked for the brief period that I had EplusTV working.

Game JSON:

{
  "best": {
    "deeplink": "sportscenter://x-callback-url/showWatchStream?playID=ec5927e0-8744-4bad-9b81-df2ceeefccd0",
    "deeplink_source": "ESPN Watch Graph",
    "espn_graph_id": "ec5927e0-8744-4bad-9b81-df2ceeefccd0",
    "http_deeplink_url": null,
    "logical_service": "espn_linear",
    "provider": "sportscenter",
    "reason": "Top of filtered playables order"
  },
  "event": {
    "airing_type": "live",
    "channel_name": "ESPN",
    "channel_provider_id": "espn-plus",
    "classification_json": "[{\"type\": \"sport\", \"value\": \"Softball\"}, {\"type\": \"league\", \"value\": \"College Softball\"}]",
    "content_segments_json": "[]",
    "created_ms": null,
    "created_utc": null,
    "end_ms": 1772993100000,
    "end_utc": "2026-03-08T18:05:00+00:00",
    "genres_json": "[\"Softball\"]",
    "hero_image_url": "https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/1280x720KF.TVALC03.jpg",
    "id": "appletv-umc.cse.5ydq22jsveywojac4x1tvcujt",
    "is_free": 0,
    "is_premium": 1,
    "last_seen_utc": "2026-03-04T07:41:39+00:00",
    "pvid": "umc.cse.5ydq22jsveywojac4x1tvcujt",
    "raw_attributes_json": "{\"images\": {\"contentImage\": {\"height\": 2160, \"isP3\": false, \"joeColor\": \"b:rgb(42,94,132) p:rgb(102,188,249) s:rgb(102,188,249) t:rgb(90,169,226) q:rgb(90,169,226)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/eDCjDa-WKqCan005Zt6HHg/{w}x{h}sr.{f}\", \"width\": 3840}, \"contentImageLive\": {\"height\": 2160, \"isP3\": false, \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}sr.{f}\", \"width\": 3840}, \"contentImagePost\": {\"height\": 2160, \"isP3\": false, \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}sr.{f}\", \"width\": 3840}, \"leagueLogo\": {\"height\": 760, \"joeColor\": \"b:rgb(13,33,49) p:rgb(236,240,244) s:rgb(237,238,239) t:rgb(192,199,205) q:rgb(192,197,201)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/AC8X3WF33GxmQ0shCma_Gg/{w}x{h}bb.{f}\", \"width\": 760}, \"shelfItemImage\": {\"height\": 2160, \"isP3\": false, \"joeColor\": \"b:rgb(42,94,132) p:rgb(102,188,249) s:rgb(102,188,249) t:rgb(90,169,226) q:rgb(90,169,226)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/eDCjDa-WKqCan005Zt6HHg/{w}x{h}Sports.TVALC01.{f}\", \"width\": 3840}, \"shelfItemImageLive\": {\"height\": 2160, \"isP3\": false, \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}KF.TVALC03.{f}\", \"width\": 3840}, \"shelfItemImagePost\": {\"height\": 2160, \"isP3\": false, \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}KF.TVALC03.{f}\", \"width\": 3840}}, \"competitors\": [{\"abbreviation\": \"TEX\", \"backgroundColor\": \"#BF5700\", \"id\": \"umc.cst.31aauykvtdfmc0qydiporrx0j\", \"images\": {\"masterArtLogo\": {\"height\": 5700, \"joeColor\": \"b:rgb(152,69,0) p:rgb(249,245,242) s:rgb(244,236,229) t:rgb(230,210,193) q:rgb(226,203,183)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/U7wPlD2To_0tk83D0BY29A/{w}x{h}{c}.{f}\", \"width\": 6448}, \"teamLogo\": {\"height\": 760, \"isP3\": false, \"joeColor\": \"b:rgb(158,70,1) p:rgb(250,245,242) s:rgb(245,236,229) t:rgb(231,210,194) q:rgb(227,203,184)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/X_KUzP7ZW5AKc_NZyo8Q_w/{w}x{h}.{f}\", \"width\": 760}, \"teamLogoDark\": {\"height\": 760, \"isP3\": false, \"joeColor\": \"b:rgb(158,70,1) p:rgb(250,245,242) s:rgb(245,236,229) t:rgb(231,210,194) q:rgb(227,203,184)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/X_KUzP7ZW5AKc_NZyo8Q_w/{w}x{h}.{f}\", \"width\": 760}, \"teamLogoLight\": {\"height\": 760, \"isP3\": false, \"joeColor\": \"b:rgb(158,70,1) p:rgb(250,245,242) s:rgb(245,236,229) t:rgb(231,210,194) q:rgb(227,203,184)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/X_KUzP7ZW5AKc_NZyo8Q_w/{w}x{h}.{f}\", \"width\": 760}}, \"isHome\": false, \"leagueId\": \"umc.csl.68xersvuh1ma3ijo7dphbd9ij\", \"name\": \"Texas Longhorns\", \"nickname\": \"Longhorns\", \"shortName\": \"Texas\", \"type\": \"Team\"}, {\"abbreviation\": \"SCAR\", \"backgroundColor\": \"#73000a\", \"id\": \"umc.cst.yg7hptch7dg690hbbhq6wtf9\", \"images\": {\"masterArtLogo\": {\"height\": 5700, \"joeColor\": \"b:rgb(115,0,10) p:rgb(240,229,230) s:rgb(243,134,166) t:rgb(215,183,186) q:rgb(217,107,134)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/YVGEO8AlZBCyNPKICxrMKA/{w}x{h}{c}.{f}\", \"width\": 6448}, \"teamLogo\": {\"height\": 760, \"isP3\": false, \"joeColor\": \"b:rgb(35,30,31) p:rgb(243,235,237) s:rgb(223,195,204) t:rgb(201,194,196) q:rgb(185,162,169)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/tc-ZmKfy23qJXOuA3n3i6w/{w}x{h}.{f}\", \"width\": 760}, \"teamLogoDark\": {\"height\": 760, \"isP3\": false, \"joeColor\": \"b:rgb(35,30,31) p:rgb(243,235,237) s:rgb(223,195,204) t:rgb(201,194,196) q:rgb(185,162,169)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/tc-ZmKfy23qJXOuA3n3i6w/{w}x{h}.{f}\", \"width\": 760}, \"teamLogoLight\": {\"height\": 760, \"isP3\": false, \"joeColor\": \"b:rgb(35,30,31) p:rgb(243,235,237) s:rgb(223,195,204) t:rgb(201,194,196) q:rgb(185,162,169)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/tc-ZmKfy23qJXOuA3n3i6w/{w}x{h}.{f}\", \"width\": 760}}, \"isHome\": false, \"leagueId\": \"umc.csl.68xersvuh1ma3ijo7dphbd9ij\", \"name\": \"South Carolina Gamecocks\", \"nickname\": \"Gamecocks\", \"shortName\": \"SC\", \"type\": \"Team\"}], \"channels\": [{\"appAdamIds\": [\"317469184\"], \"appAgeRestrictionRatingValue\": 300, \"appBundleIds\": [\"com.espn.ScoreCenter\"], \"appName\": \"ESPN: Live Sports & Scores\", \"appStoreUrl\": \"https://itunes.apple.com/app/id317469184?mt=8\", \"hexColor\": \"#EF4135\", \"id\": \"tvs.sbd.30061\", \"images\": {\"appIcon\": {\"height\": 768, \"supportsLayeredImage\": true, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/c7/85/a8/c785a884-1e56-7259-8f7c-0d3cab0c488f/App_Icon_-_Small-marketing.lsr/{w}x{h}.{f}\", \"width\": 1280}, \"logoGlyph\": {\"height\": 58, \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/UETqn_AmS3bWeVD1uzaDXA/{w}x{h}.{f}\", \"width\": 110}, \"squareColorLogo\": {\"height\": 2963, \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/55bIoUyMmJKUAs6qbfcA-g/{w}x{h}SWL.TVARHBL1.{f}?bColor=EF4135\", \"width\": 2963}, \"whiteLogo\": {\"height\": 742, \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/TFnNkhwyYGtAJ2k_ynBZgw/{w}x{h}.{f}\", \"width\": 3000}}, \"isApSubscription\": false, \"isAppleMusicImmersiveBrand\": false, \"isAppleTvPlus\": false, \"isConsented\": false, \"isFirstParty\": false, \"isInstalled\": false, \"isItunes\": false, \"isMountainBrand\": false, \"isStaging\": false, \"isSubscribed\": false, \"isTvAppBrand\": false, \"isWatchlistEnabled\": true, \"minWatchlistAppVersion\": \"6.4.0\", \"name\": \"ESPN\", \"shouldTrackPlayActivity\": true, \"title\": \"ESPN\", \"type\": \"Brand\", \"url\": \"https://tv.apple.com/us/channel/espn/tvs.sbd.30061\"}], \"playables\": {\"tvs.sbd.30061:550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d:2d654663\": {\"airingType\": \"Live\", \"canonicalId\": \"umc.cse.5ydq22jsveywojac4x1tvcujt\", \"canonicalMetadata\": {\"images\": {\"contentImage\": {\"height\": 2160, \"joeColor\": \"b:rgb(42,94,132) p:rgb(102,188,249) s:rgb(102,188,249) t:rgb(90,169,226) q:rgb(90,169,226)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/eDCjDa-WKqCan005Zt6HHg/{w}x{h}Sports.TVALC01.{f}\", \"width\": 3840}, \"posterImageLive\": {\"height\": 2160, \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}sr.{f}\", \"width\": 3840}, \"posterImagePost\": {\"height\": 2160, \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\", \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}KF.TVALC03.{f}\", \"width\": 3840}}, \"leagueName\": \"College Softball\", \"leagueShortName\": \"College Softball\", \"shortTitle\": \"#3 Texas vs. #24 South Carolina\", \"sportName\": \"Softball\", \"venueAddr\": \"Columbia, South Carolina, US\", \"venueName\": \"Carolina Softball Stadium at Beckham Field\"}, \"channelId\": \"tvs.sbd.30061\", \"contentId\": \"umc.cmr.espn.sp.p3vzdcn63cx4zifzl1oejs2r\", \"contentType\": \"SportingEvent\", \"entitlementReason\": \"Unknown\", \"eventTime\": {\"gameKickOffStartTime\": 1772985600000, \"liveBadgeTime\": {\"endTime\": 1772993100000, \"startTime\": 1772985600000}, \"playerInfoDisplayTime\": {\"endTime\": 1772996400000, \"startTime\": 1772985600000}, \"playerInfoTransportBarTime\": {\"endTime\": 1772996400000, \"startTime\": 1772985600000}, \"tuneInTime\": {\"endTime\": 1772993100000, \"startTime\": 1772985600000}}, \"externalId\": \"550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d\", \"externalServiceId\": \"com.espn.service.linear.sec\", \"id\": \"tvs.sbd.30061:550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d:2d654663\", \"isConsented\": false, \"isDownloadable\": false, \"isEligibleForPlayerTabs\": true, \"isEmbargoed\": false, \"isEntitledToPlay\": false, \"isEntitledToPlayOnDevice\": false, \"isGeoRestricted\": false, \"isItunes\": false, \"isKeyPlayAvailable\": false, \"isUpgradeEligible\": false, \"locales\": [{\"displayName\": \"English (United States)\", \"locale\": \"en_US\"}], \"makeAdditionalPlayerTabsRequest\": false, \"playablePassThrough\": \"eyJwbGF5YWJsZUlkIjoidHZzLnNiZC4zMDA2MTo1NTBiYjk5OS1lZDdiLTRmMDEtOGFiOS04ZTRhYjlhM2YzNmQ6MmQ2NTQ2NjMifQ==\", \"primaryLocale\": {\"displayName\": \"English (United States)\", \"locale\": \"en_US\"}, \"punchoutUrls\": {\"play\": \"sportscenter://x-callback-url/showWatchStream?playChannel=sec&x-source=AppleUMC\"}, \"releaseDate\": 1772985600000, \"requiresLocationConsent\": false, \"serviceId\": \"tvs.lvs.30043\", \"serviceLogo\": {\"height\": 800, \"supportsLayeredImage\": false, \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/OnI1DtPkNUoZ_H-QA0sJ6Q/{w}x{h}.{f}\", \"width\": 2000}, \"serviceName\": \"SEC Network\", \"title\": \"#3 Texas vs. #24 South Carolina\", \"type\": \"Event\"}}, \"sport_name\": \"Softball\", \"league_name\": \"College Softball\", \"apple_tv_url\": \"https://tv.apple.com/us/sporting-event/3-texas-vs-24-south-carolina/umc.cse.5ydq22jsveywojac4x1tvcujt\"}",
    "runtime_secs": 7500,
    "slug": null,
    "start_ms": 1772985600000,
    "start_utc": "2026-03-08T16:00:00+00:00",
    "synopsis": "Softball - (College Softball) - Texas Longhorns vs South Carolina Gamecocks - Available on ESPN",
    "synopsis_brief": "Softball - (College Softball) - Texas Longhorns vs South Carolina Gamecocks - Available on ESPN",
    "title": "College Softball: #3 Texas vs. #24 South Carolina",
    "title_brief": "#3 Texas vs. #24 South Carolina"
  },
  "is_live_now": false,
  "ok": true,
  "playables": [
    {
      "content_id": "umc.cmr.espn.sp.p3vzdcn63cx4zifzl1oejs2r",
      "created_utc": "2026-03-04T07:41:39Z",
      "deeplink_open": null,
      "deeplink_play": "sportscenter://x-callback-url/showWatchStream?playID=550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d",
      "espn_graph_id": "ec5927e0-8744-4bad-9b81-df2ceeefccd0",
      "event_id": "appletv-umc.cse.5ydq22jsveywojac4x1tvcujt",
      "http_deeplink_url": "https://www.espn.com/watch/player/_/id/550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d",
      "locale": null,
      "logical_service": "espn_linear",
      "playable_id": "tvs.sbd.30061:550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d:2d654663",
      "playable_url": null,
      "priority": 0,
      "provider": "sportscenter",
      "service_name": "SEC Network",
      "title": "#3 Texas vs. #24 South Carolina"
    }
  ],
  "pretty_json_fields": [
    {
      "key": "classification_json",
      "value": "[\n  {\n    \"type\": \"sport\",\n    \"value\": \"Softball\"\n  },\n  {\n    \"type\": \"league\",\n    \"value\": \"College Softball\"\n  }\n]"
    },
    {
      "key": "genres_json",
      "value": "[\n  \"Softball\"\n]"
    },
    {
      "key": "content_segments_json",
      "value": "[]"
    },
    {
      "key": "raw_attributes_json",
      "value": "{\n  \"images\": {\n    \"contentImage\": {\n      \"height\": 2160,\n      \"isP3\": false,\n      \"joeColor\": \"b:rgb(42,94,132) p:rgb(102,188,249) s:rgb(102,188,249) t:rgb(90,169,226) q:rgb(90,169,226)\",\n      \"supportsLayeredImage\": false,\n      \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/eDCjDa-WKqCan005Zt6HHg/{w}x{h}sr.{f}\",\n      \"width\": 3840\n    },\n    \"contentImageLive\": {\n      \"height\": 2160,\n      \"isP3\": false,\n      \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\",\n      \"supportsLayeredImage\": false,\n      \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}sr.{f}\",\n      \"width\": 3840\n    },\n    \"contentImagePost\": {\n      \"height\": 2160,\n      \"isP3\": false,\n      \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\",\n      \"supportsLayeredImage\": false,\n      \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}sr.{f}\",\n      \"width\": 3840\n    },\n    \"leagueLogo\": {\n      \"height\": 760,\n      \"joeColor\": \"b:rgb(13,33,49) p:rgb(236,240,244) s:rgb(237,238,239) t:rgb(192,199,205) q:rgb(192,197,201)\",\n      \"supportsLayeredImage\": false,\n      \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/AC8X3WF33GxmQ0shCma_Gg/{w}x{h}bb.{f}\",\n      \"width\": 760\n    },\n    \"shelfItemImage\": {\n      \"height\": 2160,\n      \"isP3\": false,\n      \"joeColor\": \"b:rgb(42,94,132) p:rgb(102,188,249) s:rgb(102,188,249) t:rgb(90,169,226) q:rgb(90,169,226)\",\n      \"supportsLayeredImage\": false,\n      \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/eDCjDa-WKqCan005Zt6HHg/{w}x{h}Sports.TVALC01.{f}\",\n      \"width\": 3840\n    },\n    \"shelfItemImageLive\": {\n      \"height\": 2160,\n      \"isP3\": false,\n      \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\",\n      \"supportsLayeredImage\": false,\n      \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}KF.TVALC03.{f}\",\n      \"width\": 3840\n    },\n    \"shelfItemImagePost\": {\n      \"height\": 2160,\n      \"isP3\": false,\n      \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\",\n      \"supportsLayeredImage\": false,\n      \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}KF.TVALC03.{f}\",\n      \"width\": 3840\n    }\n  },\n  \"competitors\": [\n    {\n      \"abbreviation\": \"TEX\",\n      \"backgroundColor\": \"#BF5700\",\n      \"id\": \"umc.cst.31aauykvtdfmc0qydiporrx0j\",\n      \"images\": {\n        \"masterArtLogo\": {\n          \"height\": 5700,\n          \"joeColor\": \"b:rgb(152,69,0) p:rgb(249,245,242) s:rgb(244,236,229) t:rgb(230,210,193) q:rgb(226,203,183)\",\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/U7wPlD2To_0tk83D0BY29A/{w}x{h}{c}.{f}\",\n          \"width\": 6448\n        },\n        \"teamLogo\": {\n          \"height\": 760,\n          \"isP3\": false,\n          \"joeColor\": \"b:rgb(158,70,1) p:rgb(250,245,242) s:rgb(245,236,229) t:rgb(231,210,194) q:rgb(227,203,184)\",\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/X_KUzP7ZW5AKc_NZyo8Q_w/{w}x{h}.{f}\",\n          \"width\": 760\n        },\n        \"teamLogoDark\": {\n          \"height\": 760,\n          \"isP3\": false,\n          \"joeColor\": \"b:rgb(158,70,1) p:rgb(250,245,242) s:rgb(245,236,229) t:rgb(231,210,194) q:rgb(227,203,184)\",\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/X_KUzP7ZW5AKc_NZyo8Q_w/{w}x{h}.{f}\",\n          \"width\": 760\n        },\n        \"teamLogoLight\": {\n          \"height\": 760,\n          \"isP3\": false,\n          \"joeColor\": \"b:rgb(158,70,1) p:rgb(250,245,242) s:rgb(245,236,229) t:rgb(231,210,194) q:rgb(227,203,184)\",\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/X_KUzP7ZW5AKc_NZyo8Q_w/{w}x{h}.{f}\",\n          \"width\": 760\n        }\n      },\n      \"isHome\": false,\n      \"leagueId\": \"umc.csl.68xersvuh1ma3ijo7dphbd9ij\",\n      \"name\": \"Texas Longhorns\",\n      \"nickname\": \"Longhorns\",\n      \"shortName\": \"Texas\",\n      \"type\": \"Team\"\n    },\n    {\n      \"abbreviation\": \"SCAR\",\n      \"backgroundColor\": \"#73000a\",\n      \"id\": \"umc.cst.yg7hptch7dg690hbbhq6wtf9\",\n      \"images\": {\n        \"masterArtLogo\": {\n          \"height\": 5700,\n          \"joeColor\": \"b:rgb(115,0,10) p:rgb(240,229,230) s:rgb(243,134,166) t:rgb(215,183,186) q:rgb(217,107,134)\",\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/YVGEO8AlZBCyNPKICxrMKA/{w}x{h}{c}.{f}\",\n          \"width\": 6448\n        },\n        \"teamLogo\": {\n          \"height\": 760,\n          \"isP3\": false,\n          \"joeColor\": \"b:rgb(35,30,31) p:rgb(243,235,237) s:rgb(223,195,204) t:rgb(201,194,196) q:rgb(185,162,169)\",\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/tc-ZmKfy23qJXOuA3n3i6w/{w}x{h}.{f}\",\n          \"width\": 760\n        },\n        \"teamLogoDark\": {\n          \"height\": 760,\n          \"isP3\": false,\n          \"joeColor\": \"b:rgb(35,30,31) p:rgb(243,235,237) s:rgb(223,195,204) t:rgb(201,194,196) q:rgb(185,162,169)\",\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/tc-ZmKfy23qJXOuA3n3i6w/{w}x{h}.{f}\",\n          \"width\": 760\n        },\n        \"teamLogoLight\": {\n          \"height\": 760,\n          \"isP3\": false,\n          \"joeColor\": \"b:rgb(35,30,31) p:rgb(243,235,237) s:rgb(223,195,204) t:rgb(201,194,196) q:rgb(185,162,169)\",\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/tc-ZmKfy23qJXOuA3n3i6w/{w}x{h}.{f}\",\n          \"width\": 760\n        }\n      },\n      \"isHome\": false,\n      \"leagueId\": \"umc.csl.68xersvuh1ma3ijo7dphbd9ij\",\n      \"name\": \"South Carolina Gamecocks\",\n      \"nickname\": \"Gamecocks\",\n      \"shortName\": \"SC\",\n      \"type\": \"Team\"\n    }\n  ],\n  \"channels\": [\n    {\n      \"appAdamIds\": [\n        \"317469184\"\n      ],\n      \"appAgeRestrictionRatingValue\": 300,\n      \"appBundleIds\": [\n        \"com.espn.ScoreCenter\"\n      ],\n      \"appName\": \"ESPN: Live Sports & Scores\",\n      \"appStoreUrl\": \"https://itunes.apple.com/app/id317469184?mt=8\",\n      \"hexColor\": \"#EF4135\",\n      \"id\": \"tvs.sbd.30061\",\n      \"images\": {\n        \"appIcon\": {\n          \"height\": 768,\n          \"supportsLayeredImage\": true,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/c7/85/a8/c785a884-1e56-7259-8f7c-0d3cab0c488f/App_Icon_-_Small-marketing.lsr/{w}x{h}.{f}\",\n          \"width\": 1280\n        },\n        \"logoGlyph\": {\n          \"height\": 58,\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/UETqn_AmS3bWeVD1uzaDXA/{w}x{h}.{f}\",\n          \"width\": 110\n        },\n        \"squareColorLogo\": {\n          \"height\": 2963,\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/55bIoUyMmJKUAs6qbfcA-g/{w}x{h}SWL.TVARHBL1.{f}?bColor=EF4135\",\n          \"width\": 2963\n        },\n        \"whiteLogo\": {\n          \"height\": 742,\n          \"supportsLayeredImage\": false,\n          \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/TFnNkhwyYGtAJ2k_ynBZgw/{w}x{h}.{f}\",\n          \"width\": 3000\n        }\n      },\n      \"isApSubscription\": false,\n      \"isAppleMusicImmersiveBrand\": false,\n      \"isAppleTvPlus\": false,\n      \"isConsented\": false,\n      \"isFirstParty\": false,\n      \"isInstalled\": false,\n      \"isItunes\": false,\n      \"isMountainBrand\": false,\n      \"isStaging\": false,\n      \"isSubscribed\": false,\n      \"isTvAppBrand\": false,\n      \"isWatchlistEnabled\": true,\n      \"minWatchlistAppVersion\": \"6.4.0\",\n      \"name\": \"ESPN\",\n      \"shouldTrackPlayActivity\": true,\n      \"title\": \"ESPN\",\n      \"type\": \"Brand\",\n      \"url\": \"https://tv.apple.com/us/channel/espn/tvs.sbd.30061\"\n    }\n  ],\n  \"playables\": {\n    \"tvs.sbd.30061:550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d:2d654663\": {\n      \"airingType\": \"Live\",\n      \"canonicalId\": \"umc.cse.5ydq22jsveywojac4x1tvcujt\",\n      \"canonicalMetadata\": {\n        \"images\": {\n          \"contentImage\": {\n            \"height\": 2160,\n            \"joeColor\": \"b:rgb(42,94,132) p:rgb(102,188,249) s:rgb(102,188,249) t:rgb(90,169,226) q:rgb(90,169,226)\",\n            \"supportsLayeredImage\": false,\n            \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/eDCjDa-WKqCan005Zt6HHg/{w}x{h}Sports.TVALC01.{f}\",\n            \"width\": 3840\n          },\n          \"posterImageLive\": {\n            \"height\": 2160,\n            \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\",\n            \"supportsLayeredImage\": false,\n            \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}sr.{f}\",\n            \"width\": 3840\n          },\n          \"posterImagePost\": {\n            \"height\": 2160,\n            \"joeColor\": \"b:rgb(49,53,56) p:rgb(217,208,199) s:rgb(183,195,209) t:rgb(183,177,171) q:rgb(156,166,178)\",\n            \"supportsLayeredImage\": false,\n            \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/WOdIWO4Yn61r3aloYrPvCw/{w}x{h}KF.TVALC03.{f}\",\n            \"width\": 3840\n          }\n        },\n        \"leagueName\": \"College Softball\",\n        \"leagueShortName\": \"College Softball\",\n        \"shortTitle\": \"#3 Texas vs. #24 South Carolina\",\n        \"sportName\": \"Softball\",\n        \"venueAddr\": \"Columbia, South Carolina, US\",\n        \"venueName\": \"Carolina Softball Stadium at Beckham Field\"\n      },\n      \"channelId\": \"tvs.sbd.30061\",\n      \"contentId\": \"umc.cmr.espn.sp.p3vzdcn63cx4zifzl1oejs2r\",\n      \"contentType\": \"SportingEvent\",\n      \"entitlementReason\": \"Unknown\",\n      \"eventTime\": {\n        \"gameKickOffStartTime\": 1772985600000,\n        \"liveBadgeTime\": {\n          \"endTime\": 1772993100000,\n          \"startTime\": 1772985600000\n        },\n        \"playerInfoDisplayTime\": {\n          \"endTime\": 1772996400000,\n          \"startTime\": 1772985600000\n        },\n        \"playerInfoTransportBarTime\": {\n          \"endTime\": 1772996400000,\n          \"startTime\": 1772985600000\n        },\n        \"tuneInTime\": {\n          \"endTime\": 1772993100000,\n          \"startTime\": 1772985600000\n        }\n      },\n      \"externalId\": \"550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d\",\n      \"externalServiceId\": \"com.espn.service.linear.sec\",\n      \"id\": \"tvs.sbd.30061:550bb999-ed7b-4f01-8ab9-8e4ab9a3f36d:2d654663\",\n      \"isConsented\": false,\n      \"isDownloadable\": false,\n      \"isEligibleForPlayerTabs\": true,\n      \"isEmbargoed\": false,\n      \"isEntitledToPlay\": false,\n      \"isEntitledToPlayOnDevice\": false,\n      \"isGeoRestricted\": false,\n      \"isItunes\": false,\n      \"isKeyPlayAvailable\": false,\n      \"isUpgradeEligible\": false,\n      \"locales\": [\n        {\n          \"displayName\": \"English (United States)\",\n          \"locale\": \"en_US\"\n        }\n      ],\n      \"makeAdditionalPlayerTabsRequest\": false,\n      \"playablePassThrough\": \"eyJwbGF5YWJsZUlkIjoidHZzLnNiZC4zMDA2MTo1NTBiYjk5OS1lZDdiLTRmMDEtOGFiOS04ZTRhYjlhM2YzNmQ6MmQ2NTQ2NjMifQ==\",\n      \"primaryLocale\": {\n        \"displayName\": \"English (United States)\",\n        \"locale\": \"en_US\"\n      },\n      \"punchoutUrls\": {\n        \"play\": \"sportscenter://x-callback-url/showWatchStream?playChannel=sec&x-source=AppleUMC\"\n      },\n      \"releaseDate\": 1772985600000,\n      \"requiresLocationConsent\": false,\n      \"serviceId\": \"tvs.lvs.30043\",\n      \"serviceLogo\": {\n        \"height\": 800,\n        \"supportsLayeredImage\": false,\n        \"url\": \"https://is1-ssl.mzstatic.com/image/thumb/OnI1DtPkNUoZ_H-QA0sJ6Q/{w}x{h}.{f}\",\n        \"width\": 2000\n      },\n      \"serviceName\": \"SEC Network\",\n      \"title\": \"#3 Texas vs. #24 South Carolina\",\n      \"type\": \"Event\"\n    }\n  },\n  \"sport_name\": \"Softball\",\n  \"league_name\": \"College Softball\",\n  \"apple_tv_url\": \"https://tv.apple.com/us/sporting-event/3-texas-vs-24-south-carolina/umc.cse.5ydq22jsveywojac4x1tvcujt\"\n}"
    }
  ],
  "providers": [
    "espn_linear"
  ]
}

Pass that I hoped would record it:
image

So... is this something that might happen someday? Not going to happen? Setup error on my part? Something I might have to squeeze into the tool chain somehow if I could figure out how?

BTW, the beauty of the team id is that Channels recognizes it regardless of what the event title or channel is, so whether it's a tournament, game of the week, or whatever, the team ID is matched and the recording happens. Just using the abbrevation for the school "SCAR" won't get just the sports I want.

Hate to burst your bubble... But, as I understand it, teamIDs come from Gracenote (i think?) and the EPG that FDL generates aren't that rich. I made them with the information I gathered from the scrape and tried to make it as pretty as I could, but it'll never be as rich as Gracenote.

I'll defer to others on ways to work around this, but systematically, FDL will probably never be able to accomplish teamIDs.

1 Like

I've always had passes with "Connecticut" and "UConn" + sports for this reason.

Make sure you use "South Carolina" since your school is neither USC nor Carolina.
(Sorry - too easy)

Make sure you use "South Carolina" since your school is neither USC nor Carolina.

You can take that attitude and hoist a blue flag in LA. I didn't use the USC abbreviation on purpose, though we're more entitled to it than that other school with a mascot named after a product dispensed on bathroom walls.

I could see some sort of mapping from what appears to be an Apple internal code (the one that starts "umc.cst." to the TeamId that CDVR uses.

I think a better solution would be if CDVR would allow you to pass that code, prefix and all, to CDVR and have CDVR accept any arbitrary string as "a" team id, and you just put one for each source you need in a Pass (multiple Passes if necessary). I don't know what the event schema is that you're passing to CDVR and what the requirements are for the TeamId element, nor how CDVR stores that in its database. But it seems somewhat arbitrary that CDVR thinks every data feed would use the Gracenote TeamId format.

EDIT: I see that there's a provision to "map" channels to the standard CDVR guide channels, so that channels can use its own guide data with the TeamID in it. I'm assuming that won't work, even with linear channels, using ADBTuner, because there's not a persistent 1:1 relationship between an ADBTuner lane and a CDVR guide channel, because the first ADBTuner ESPN lane could be ESPN at 6:00 PM and SECN at 9:00 PM.

If you can find a DB of team codes, I'd be happy to try to do something but quick search didn't find anything. I think the Apple internal code is just that - internal to Apple

I'm thinking I could mine the apple feed you're pulling from for a list of sports, team names, and internal Apple IDs to build a mapping list. Next I need some way of pulling the same thing from Gracenote. Assuming I could do that, I could match them up by sport and name and produce a JSON that gives you the one:one mapping.

The obvious answer to getting the Gracenote list would be to sign up for a Gracenote developer account and paying for the access, but that's not attractive for speculative work.

I'm wondering if there's any way to pull a list of events that CDVR sees with team ids? Their Show API doesn't appear to expose the TeamId. Is there an M3U feed that might? This won't be a one-time thing, I'll have to do this 4-6 times through the year before we've gone through all the sports seasons and had at least most of the teams show up in both lists so that they can be matched. We're already losing women's college basketball teams from the schedule for this year as the conference tournaments play out.

UPDATE: The CDVR Grid data has the numbers in it. I'm going to start collecting captures for a a bit. We'll see in a few days how practical this is.

Hi @KineticMan
Apple TV now has F1 broadcasts. Season starts this weekend. Curious if you are seeing that in any of your scans. It looks you are separating MLS and MLB on Apple broadcasts though separate lanes. Would you do something similar for F1?

I'm flumoxed now. There's an event for Friday at Noon EST on the main ESPN channel. I see it in the feed in FDL. It doesn't seem to be coming out in the XML, and I don't understand why not. Tools for running this down?

are you using "lanes" or "Direct" ?
wonder if your "lanes" are full during that time?

Yes. (both). I burned everything to the ground and started over. (I kept the containers, but removed all the sources from CDVR and recreated the lanes using Olive Tin/P1C). I also checked the filters and saw that some new leagues/sports had shown up to mark as unwanted.

It's showing in the XML now and got picked up by CDVR for recording. Not sure I trust it, but... :slight_smile: Here goes.

My nightly gather also crashed with some odd Python errors:

2026-03-05 02:30:41,741 - INFO - === Driver Initialization Complete (system: /usr/bin/chromedriver) ===
[Hybrid] Establishing browser session...
Traceback (most recent call last):
File "/app/bin/apple_scraper_db.py", line 982, in <module>
raise SystemExit(main())
^^^^^^
File "/app/bin/apple_scraper_db.py", line 848, in main
driver.get(SEARCH_URL.format(term="all"))
File "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 356, in get
self.execute(Command.GET, {"url": url})
File "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 347, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 300.000
(Session info: chrome=145.0.7632.116)
Stacktrace:
#0 0x561eb7c2339e <unknown>
#1 0x561eb75e5c92 <unknown>
#2 0x561eb75d0c8c <unknown>
#3 0x561eb75d0a79 <unknown>
#4 0x561eb75cf076 <unknown>
#5 0x561eb75cf526 <unknown>
#6 0x561eb75ddb87 <unknown>
#7 0x561eb75f323d <unknown>
#8 0x561eb75f8a5b <unknown>
#9 0x561eb75cfb31 <unknown>
#10 0x561eb75f307f <unknown>
#11 0x561eb7675afa <unknown>
#12 0x561eb7655dc3 <unknown>
#13 0x561eb7625ec5 <unknown>
#14 0x561eb7626ab1 <unknown>
#15 0x561eb7be7780 <unknown>
#16 0x561eb7beaa38 <unknown>
#17 0x561eb7bea4ea <unknown>
#18 0x561eb7beaea5 <unknown>
#19 0x561eb7bd72fb <unknown>
#20 0x561eb7beb207 <unknown>
#21 0x561eb7bbef36 <unknown>
#22 0x561eb7c0feb5 <unknown>
#23 0x561eb7c100ac <unknown>
#24 0x561eb7c21a1f <unknown>
#25 0x7f3486b491f5 <unknown>
[ERROR] Step 1 FAILED with exit code 1
[2026-03-05 02:35:42] [ERROR] Auto refresh failed with code 1
1 Like

I've never seen those errors before, but it's likely your container ran out of memory for some reason. not sure what device your running this on but honestly it doesn't take much horsepower. keep an eye on it for me

System is not very beefy, but also doesn't typically have a lot going on at 2:30 AM. It ran fine this morning.