TUI for sports reminds me that in Finland, teletext is still very popular for following sports (football, ice hockey, even F1)
TUI gets you straight to the point, no ads, etc. So the teletext format is now outliving TVs and people read the teletext pages on their mobile phones (via we of dedicated apps)
Oh that's fantastic, way better than searching for results on modern sports news sites. Definitely bookmarking this, maybe I'll accidentally learn a bit of Finnish.
This is really very cool and as a geek who loves F1, I can't wait to play with this over this weekend and beyond.
I'm curious where the live/static data is coming from and how freely available it is. Most sports are very protective of their data rights in the betting era (I know of one guy who spends six figures on tennis data a year - and yes, he makes a profit from it), so I'm wondering if/how F1 sees all this.
Regardless, I think this is absolutely marvellous, and can see this becoming my second/third screen while sat on the sofa enjoying the races live. Thanks, and if I can find a way to contribute/give back, I will.
Thank you! The data comes from a SignalR data stream that F1 provides. It's not exactly public, but also not protected. There are some other projects (like FastF1) which have done a lot of working understanding this data, so all kudos go to them.
There's also static API endpoints which contain .json and .jsonStream files after a session ends, so you can process all the data and run some analytics on it.
I assume they don't mind too much about the usage - on the basis that some of these projects have existed for quite a while. I'm pretty sure everything who performs F1 analysis (like journalists, YouTubers etc) with charts and the like and getting their data via these feeds (either directly or via packages like FastF1.
If you want to learn more about the implementation itself, I'd recommend checking out the DataImporter.cs and LiveTimingClient.cs files in the UndercutF1.Data project of the repo. Although fair warning, my codes not that beautiful :).
I used to work on this stuff! Cool to see open projects looking at it. Always wanted to do more, was great fun working on the visualisations and data streams.
This is awesome. My wife and me and are going to the Miami Grand Prix here in a few weeks, big fans. Excited to play with this for Jeddah sessions/race.
Wow I'd love to go to a US race at some point, the vibe in those weekends feels so unique compared to the classic European race. Hope you have a great time! Happy to take any feedback/suggestions after the Jeddah sessions if you have any
I was fortunate enough to go to the very first race in Austin. That was pre the DTS-driven levels of attendance you get at races these days, and (maybe because it was their first time hosting?) it was also super cheap compared to attending any other race. And honestly it was one of the best race weekends I've attended. The layout of the track (e.g., a main straight that goes into a hairpin, comes back downhill, sweeps back right and uphill...) seems almost uniquely designed to give someone in the paddock the ability to watch multiple parts of the circuit. Also Austin was just a great city to visit too.
Looks enticing! Regrettably a quick install (using the dotnet tool method, Win10) installs without error, but running the app results in an unresponsive window (both terminal and console), logs show no error... None of the key commands work (not even Q). Import data woks, but does not change the unresponsive window.
Not looking for tech support, just making you aware that some additional steps might be required in the README (are there geographic limitations?). Thanks!
Thanks for the heads up. I think there might be some intricacies with different terminals and OS's which I hasn't fully appreciated (I've only been testing this on a arm64 Mac unfortunately). I have made a new release (https://github.com/JustAman62/undercut-f1/releases/tag/v3.0....) which might help fix the issue - but I'll need to get my hands on a windows machine again to validate, which I should be able to do in the next couple of days.
Unfortunately I think this is because I haven't signed the executable. I've signed the Mac executable (as I already have an Apple dev account), but the Microsoft process seems to be a bit more involved and requires an expensive EV certificate. I'll look in to this further, but I can't promise anything.
Usually downloading the app as a dotnet tool doesn't get flagged as a virus, but it seems this isn't always the case.
Thank you for this! I love F1 and TUIs, this will be perfect for my desire to know more of what my midfield favorites are doing while the broadcasters are watching the front!
As it happens, I started to make this back when McLaren weren't doing quite as well as they are now... for exactly the reason you describe. Being able to see pit windows easily for drivers all the way down the field, and observe lap times and relative gaps for drivers makes following the midfield much easier.
Unfortunately I don't handle lapped drivers very well, once they're lapped much of the gap related stuff stops working for them. Thankfully the last year or so the field has been close enough where that's not too much of an issue.
I've been using F1 Multiviewer which is free but the metadata and video feeds require an F1TV subscription which I have because I usually prefer the F1TV announcers. With F1 there's only one main broadcast video feed produced for on-track racing and it's mixed raw with no announcers. Then F1TV and various national TV networks add their own announcers downstream. In the US F1 is broadcast by ESPN who use the Sky TV announcers from the UK. F1TV, which is owned by F1, also produce their own separate announcer audio in English and offer it through online streaming along with a metadata feed - both live and for later replay. Metadata and video feeds are also available through other licensed outlets - and, of course, various unofficial, unlicensed sources.
F1 Multiviewer is a community created, fan supported app which only works with the F1TV video and metadata feeds via the official API (hence the need for an F1TV subscription). It has a bunch of different configurable data screens which are graphically well-presented. It's possible to create and save complex multi-screen views showing various data screens along with simultaneous in-car views from multiple drivers. https://multiviewer.app/showcase
It seems like a little timing variability is endemic to the F1 metadata feeds, even if just playing back after the race. Although the timing is close enough to be okay, the Multiviewer team regularly pushes updates trying to get it closer. I like to watch the main race video feed on my home theater projector screen while running Multiviewer on my laptop. So my main video source is the F1TV app on an Android streaming stick or the ESPN broadcast recording running on Comcast DVR but I use F1 Multiviewer on my laptop to view metadata, track map and a couple on-board cameras.
By manually adjusting, I can usually get Multiviewer on my laptop to sync up with the pre-recorded video stream playback on the TV to within about 5-ish seconds. I start with the main video feed in Multiviewer and use that to sync up with my recorded broadcast feed. Once the two main video feeds are synced, I use the Multiviewer command to sync all its windows to the main feed, and then minimize the main feed in Multiviewer. It works but is a bit fiddly, as just starting the feeds at the same time only gets me in the ballpark with the F1TV app or broadcast recording (usually within 30 secs). Then I do a back-and-forth cycle of skipping or pausing one or the other to sync it up, which takes maybe a minute. Fortunately, once in sync it doesn't seem to drift more than a few seconds over the course of a race which is good enough for me. The only annoying part is the bit of extra effort when pausing or rewinding to maintain sync on two different devices. I think people who just use Multiviewer on one device for all their feeds probably have it easier.
As the OP noted, once you understand F1 racing more than a casual viewer, seeing the timing gaps, track map, current tire, pit stop counts, etc becomes crucial to following the strategic chess match unfolding between teams. Unfortunately, due to screen space, the main broadcast graphics only show one of these data graphics at a time - and, too often, they are showing the wrong data vs what's happening at the moment on-track - or even what the announcers are saying since the video feed is produced separately from the announcers. To be fair, broadcasting an F1 race in real-time, is probably the single hardest regular live sports event to produce (and I know a fair bit about live sports broadcast production). With 20 cars and a couple dozen separate corners spread over a few miles, it's more akin to trying to show a half-dozen live NFL games simultaneously while never missing a key play. And, unlike most sports, once a race starts there are no commercial breaks or regularly scheduled timeouts for replays.
The F1 television production is quite spectacular for what they manage to do, like streaming 20 simultaneous HD video feeds from two (or more) onboard cameras from cars traveling up to 200 mph while twisting through dense urban environments. Just the RF engineering required to do that in one of 24 different cities around the world almost weekly makes it wildly impressive that it (usually) works pretty well. However, it's still maddening when it fails or isn't showing the relevant graphics, making some kind of over-the-top metadata with customizable display pretty essential for serious fans. Which may be somewhat unique to motorsports since a serious fan can enjoy an NFL game, basketball game or even chess match without a real-time, synced metadata feed beyond the usual broadcast graphics.
I installed on Windows using the dotnet method and it doesn't seem to work. The top line with Quit / Cursor / Session / etc shows up but none of the keys do anything.
I was hoping to test it out during the session currently going on :)
Yes correct, sorry forgot to reply to this chain. I've confirmed it works correctly on MacOS, Linux, and Windows under WSL (with the artefacts from the latest release). However, running directly under Windows has this issue where the terminal becomes unresponsive, and also only outputs a single line. I'm tracking the issue here: https://github.com/JustAman62/undercut-f1/issues/14 if anyone wants to know when Windows support is working.
However, I'd appreciate an easier way to run it: binaries for Linux aren't standalone -- they require 3rd party dependencies to be installed. Static binaries (or maybe container image?) would be nice.
I have compiled as self-contained, however I missed some configs to make sure that all native binaries were included in the final executable. I've made a new release recently (https://github.com/JustAman62/undercut-f1/releases/tag/v3.0....) which should resolve this issue.
this looks pretty cool, but I can't get delay working properly. Trying to watch the qualifying session on about a 25 minute delay, the clock indicates the correct time (17:05 or so a few minutes into the session) but the driver times aren't showing, and the radio and race control messages are current (like, I can see all of the race control messages and radio messages for all of Q1).
Ah, so unfortunately the delay is only applied to new data coming in. When you start a live session, we only get the current state and new data coming from the F1 feed, so we can't delay back to a point before you started listening to the feed. You also can't "rewind" the session, so any data that has been shown won't be removed, only new data will be added (after the delay you've set).
Currently the delay is designed for a minute or two's worth of delay for a live TV feed, or for replaying old sessions. I don't currently have a good way to support a long delay during a live session, without you starting the app before the session starts, and applying the 25 minute delay immediately so that all the data is queued up to be displayed in 25 minutes time.
There is https://openf1.org which has an API, although I don't believe it's real-time. My projects uses the SignalR stream directly from F1, but it's not very API friendly and you have to learn and do a decent amount of processing to make it in to useful display data. Check out the UndercutF1.Data project to see how this is done. FastF1 also has a live timing client, although I don't think its their preferred method of analysis.
After a session is finished, F1 do upload json and jsonStream static files which you can download - checkout the DataImporter class to see how this is done (this is what powers the undercutf1 import` command)
certainly not free, but with F1TV Access you have access to historical and real time data through the API. There should be decent documentation on it out there, otherwise projects like Multiviewer or this TUI wouldn't be quite realistic.
I have to admit, the transcription quality isn't all that great, it depends heavily on the driver and the audio quality on that particular weekend. I think it's better than nothing though.
Thank you! I'm very proud of the track map and lap charts. I mulled over for months about rewriting the app into a native app or website so that I could do proper graphics etc, but then one day earlier this year I suddenly realised I could use Terminal Graphics protocols to achieve inline graphics in the TUI itself, giving me the best of both worlds!
Yeah that's a fair point. Although I've been a bit iffy about the ethics of monetising somebody else's data - and I feel that line would be definitely crossed if I made a direct competitor to F1s own products. So monetisation is very much off the table :)
Is there any reason you couldn’t render the pixels to the screen as opposed to a constantly updated image (which as the docs note is terminal choice limiting)
I'm not personally aware of a method of doing so via a TUI, but I'd be very happy to be corrected. I was under the impression that sending images was the best way to handle non-character based output.
Thank you! Yes, learning about the kitty and iterm graphics protocols was surprisingly fun, and opened my eyes to the potential power of modern TUIs (even if I'm not making best use of all the power).
Sixel on the other hand seems like an alien protocol whose implementation daunts me - think it'll be a while before I tackle that one.
TUI gets you straight to the point, no ads, etc. So the teletext format is now outliving TVs and people read the teletext pages on their mobile phones (via we of dedicated apps)
https://yle.fi/aihe/tekstitv?P=207
If you weren't already aware of it, check out the #f1 community on libera.
Your chances are slim, or mahdollisuutesi ovat niukat.
I'm curious where the live/static data is coming from and how freely available it is. Most sports are very protective of their data rights in the betting era (I know of one guy who spends six figures on tennis data a year - and yes, he makes a profit from it), so I'm wondering if/how F1 sees all this.
Regardless, I think this is absolutely marvellous, and can see this becoming my second/third screen while sat on the sofa enjoying the races live. Thanks, and if I can find a way to contribute/give back, I will.
There's also static API endpoints which contain .json and .jsonStream files after a session ends, so you can process all the data and run some analytics on it.
I assume they don't mind too much about the usage - on the basis that some of these projects have existed for quite a while. I'm pretty sure everything who performs F1 analysis (like journalists, YouTubers etc) with charts and the like and getting their data via these feeds (either directly or via packages like FastF1.
If you want to learn more about the implementation itself, I'd recommend checking out the DataImporter.cs and LiveTimingClient.cs files in the UndercutF1.Data project of the repo. Although fair warning, my codes not that beautiful :).
> Tyre Strategy page
Nice, I'll be able to see how Ferrari have fumbled strategy for their drivers.
Usually downloading the app as a dotnet tool doesn't get flagged as a virus, but it seems this isn't always the case.
Unfortunately I don't handle lapped drivers very well, once they're lapped much of the gap related stuff stops working for them. Thankfully the last year or so the field has been close enough where that's not too much of an issue.
I've been using F1 Multiviewer which is free but the metadata and video feeds require an F1TV subscription which I have because I usually prefer the F1TV announcers. With F1 there's only one main broadcast video feed produced for on-track racing and it's mixed raw with no announcers. Then F1TV and various national TV networks add their own announcers downstream. In the US F1 is broadcast by ESPN who use the Sky TV announcers from the UK. F1TV, which is owned by F1, also produce their own separate announcer audio in English and offer it through online streaming along with a metadata feed - both live and for later replay. Metadata and video feeds are also available through other licensed outlets - and, of course, various unofficial, unlicensed sources.
F1 Multiviewer is a community created, fan supported app which only works with the F1TV video and metadata feeds via the official API (hence the need for an F1TV subscription). It has a bunch of different configurable data screens which are graphically well-presented. It's possible to create and save complex multi-screen views showing various data screens along with simultaneous in-car views from multiple drivers. https://multiviewer.app/showcase
It seems like a little timing variability is endemic to the F1 metadata feeds, even if just playing back after the race. Although the timing is close enough to be okay, the Multiviewer team regularly pushes updates trying to get it closer. I like to watch the main race video feed on my home theater projector screen while running Multiviewer on my laptop. So my main video source is the F1TV app on an Android streaming stick or the ESPN broadcast recording running on Comcast DVR but I use F1 Multiviewer on my laptop to view metadata, track map and a couple on-board cameras.
By manually adjusting, I can usually get Multiviewer on my laptop to sync up with the pre-recorded video stream playback on the TV to within about 5-ish seconds. I start with the main video feed in Multiviewer and use that to sync up with my recorded broadcast feed. Once the two main video feeds are synced, I use the Multiviewer command to sync all its windows to the main feed, and then minimize the main feed in Multiviewer. It works but is a bit fiddly, as just starting the feeds at the same time only gets me in the ballpark with the F1TV app or broadcast recording (usually within 30 secs). Then I do a back-and-forth cycle of skipping or pausing one or the other to sync it up, which takes maybe a minute. Fortunately, once in sync it doesn't seem to drift more than a few seconds over the course of a race which is good enough for me. The only annoying part is the bit of extra effort when pausing or rewinding to maintain sync on two different devices. I think people who just use Multiviewer on one device for all their feeds probably have it easier.
As the OP noted, once you understand F1 racing more than a casual viewer, seeing the timing gaps, track map, current tire, pit stop counts, etc becomes crucial to following the strategic chess match unfolding between teams. Unfortunately, due to screen space, the main broadcast graphics only show one of these data graphics at a time - and, too often, they are showing the wrong data vs what's happening at the moment on-track - or even what the announcers are saying since the video feed is produced separately from the announcers. To be fair, broadcasting an F1 race in real-time, is probably the single hardest regular live sports event to produce (and I know a fair bit about live sports broadcast production). With 20 cars and a couple dozen separate corners spread over a few miles, it's more akin to trying to show a half-dozen live NFL games simultaneously while never missing a key play. And, unlike most sports, once a race starts there are no commercial breaks or regularly scheduled timeouts for replays.
The F1 television production is quite spectacular for what they manage to do, like streaming 20 simultaneous HD video feeds from two (or more) onboard cameras from cars traveling up to 200 mph while twisting through dense urban environments. Just the RF engineering required to do that in one of 24 different cities around the world almost weekly makes it wildly impressive that it (usually) works pretty well. However, it's still maddening when it fails or isn't showing the relevant graphics, making some kind of over-the-top metadata with customizable display pretty essential for serious fans. Which may be somewhat unique to motorsports since a serious fan can enjoy an NFL game, basketball game or even chess match without a real-time, synced metadata feed beyond the usual broadcast graphics.
I was hoping to test it out during the session currently going on :)
Thanks! This is awesome work and I'm looking forward to tomorrow with much excitement.
However, I'd appreciate an easier way to run it: binaries for Linux aren't standalone -- they require 3rd party dependencies to be installed. Static binaries (or maybe container image?) would be nice.
As noted in https://github.com/JustAman62/undercut-f1/issues/3#issuecomm..., I think there's still more work to do to make the single-file executable work properly on Linux, due to the intricacies of the native Skia libs.
Currently the delay is designed for a minute or two's worth of delay for a live TV feed, or for replaying old sessions. I don't currently have a good way to support a long delay during a live session, without you starting the app before the session starts, and applying the 25 minute delay immediately so that all the data is queued up to be displayed in 25 minutes time.
After a session is finished, F1 do upload json and jsonStream static files which you can download - checkout the DataImporter class to see how this is done (this is what powers the undercutf1 import` command)
It has a Live Timing Client and a lot of historical data.
I only found it the other day, so I have no had a chance to play with it yet.
I also suspect that the trying to monetize a project like this would not sit well with the FIA, if you had any kind of traction.
Love that it is realtime as well.
Great work on this.
Sixel on the other hand seems like an alien protocol whose implementation daunts me - think it'll be a while before I tackle that one.