The long march to v4.0 involves a lot of smaller releases, making incremental progress towards some specific goals. One of these goals is the full transition from the original Penguin API (HTTP GET-based) to the new Chinstrap API (WebSocket-based). The client-side Penguin service itself is more than just a collection of APIs though. It also includes in-memory and on-disk object caching, API rate-limiting, first-time-user account setup, account limits and so on.
For this release, my intention is to focus on porting over most of the Penguin APIs and the associated object caching.
Additionally, as an unexpected last-minute thing: we’ve introduced MPEG-DASH based YouTube Live Streaming — beta. We’re still slogging through the Google OAuth Verification process. As soon as the verification is complete, it should be open to anyone who wants to test it.
This release was held up by a crash. As far as the culprit is concerned, the only real change that I could identify is the switch to Xcode 16.4. Basically, there is a Set for which access was correctly controlled with a DispatchQueue, but it was still crashing as though concurrent access was occurring. In desperation, I refactored the half dozen places where the Set was being directly read or written to, and made them instead use a set of functions that accomplished the same thing. Magically, the crash was resolved. Fun times.
- Fixes an ONVIF authentication issue where we incorrectly used the device local time zone instead of UTC time when calculating the clock difference.
- Ports the CrashReport service from Penguin to Chinstrap.
- Ports the Receipt service from Penguin to Chinstrap.
- Ports the DebugLog service from Penguin to Chinstrap.
- Ports the Promo service from Penguin to Chinstrap.
- Ports the Sound service from Penguin to Chinstrap.
- Ports the Store service from Penguin to Chinstrap.
- Ports the Integration service from Penguin to Chinstrap.
- Fixes an impressively dumb issue dating back _months_ where somehow I changed the file path for the Sound file service so that it was looking at the Weather directory instead of the Sound directory, so the "list of sounds" for a smart event action was instead a list of weather jpegs. WTF. Fixed.
- Fixes an issue where arranging the Items via the Configure Group screen did not actually result in the Item arrangement changing.
- Adds hasUnreadMessage flag to RH Account Details screen.
- Moves the Cameras caching and API service from Penguin to Chinstrap.
- Moves the Modules caching and API service from Penguin to Chinstrap.
- Moves the Group caching and API service from Penguin to Chinstrap.
- Moves the Share caching and API service from Penguin to Chinstrap.
- Moves the Smart Device caching and API service from Penguin to Chinstrap.
- Moves the File Server caching and API service from Penguin to Chinstrap.
- Moves the Integration caching and API service from Penguin to Chinstrap.
- Fixes a strange issue that I first noticed some weeks - or maybe a month - ago, and only on my older AppleTV6,2 device (both with tvOS v15.6 and v16.4) where, following VideoToolbox decoder failures (simultaneously for all of the active cameras - which is not entirely uncommon), Streamie would go through its usual error handling restart-the-decoders process, successfully, and it'd continue receiving data from the cameras, decoding video frames and sending them to the AVSampleBufferDisplayLayer (also successfully), where it would never appear (the video layers seemingly having become transparent). I rigged up some UIView.recursiveDescription stuff to see if maybe the video layers had been resized, hidden or moved on the z-axis - but, no; it was simply done with actually displaying anything. The fix is to restart (recreate) the display layer whenever video decoding fails and restarts. It's way overkill in any other circumstance, but it seems to solve this problem. For now. Additionally, there doesn’t seem to be any good way to detect that the issue is occurring.
- Fixes a crash that occurs when parsing the header of an RTP chunk which has been read off the socket completely, but the data size indicated for the RTP chunk was less than the RTP chunk header size (which is now being validated before being parsed), resulting in a crash and now a flag that the stream is corrupt.
- Fixes a crash that occurs due to a fix that I made for a crash that occurs when a header line of an RTSP message fails to parse as a UTF8 string. We now treat the stream as corrupt at that point.
- Adds preliminary (beta) support for YouTube Live Streaming. Support is limited to IP cameras using AAC audio. I accidentally used an API added in iOS / tvOS 16 (func ranges<C>(of other: C) -> [Range<Self.Index>]), but then I took pity on the folks who don't want to upgrade and I cobbled together an implementation of that so anyone on iOS / tvOS 14 should be able to live stream to YouTube. The reason for that v14.x limitation is the use of AVAssetWriter to created fragmented MP4s. I could maybe work around that, for both of you still on v13.x, neither of whom likely has any interest in live streaming to YouTube.
- Fixes a pretty bad tvOS issue where you could not reach a navigation item on a screen with no content. This is fixed by making the placeholder collection view cells focusable, which they should have been in the first place. I really need a QA person.
- Fixes a Permissions Apply issue where the process would fail if a Camera Group was a part of a Permissions Group and the Camera Group was subsequently deleted. The reason this is only true of Camera Groups is that by adding a Camera Group to a Permissions Group, you implicitly grant the same permissions for the Cameras and Modules contained in the group.
- Fixes a crash that could occur on a device that's hosting a shared (or otherwise remotely accessed) camera.
Created: 1 year ago
Updated: 1 year ago
Author: Curtis Jones
Topics: Release Notes
Streamie provides a best-in-class user experience on your iPhone, iPad, Apple TV and Apple Silicon Mac, with an intuitive user interface that makes it simple to discover, stream, record, monitor and share your HomeKit, Google Nest, Ubiquiti UniFi Protect and ONVIF-compatible IP and RTSP cameras. Streamie keeps you informed with motion event notifications and it works with most cameras using its advanced audio and video codec support. You can watch your cameras from anywhere, record 24/7 to your private NAS, remotely manage multiple locations, device permissions and seamlessly synchronize settings across your devices; configure Hubitat smart home automations, live stream to YouTube and rely on the in-app technical support system when you need help -- and you can also reach us by phone. Download Streamie today for all of your CCTV needs.