There are enough new features and changes in the past release (v4.12.1) and since, that I decided to bump this up to v4.13.0 instead of v4.12.2; kind of a last minute decision. I’m really happy that the majority of the work during the past several weeks has been driven largely by customer feedback. The tech debt cleanup (discussed later) resulting in 12k deleted lines and only 2.5k added lines, also makes me happy.
I really need to bite the bullet and make the transition to Swift 6.
Beyond that, I don’t have anything in particular lined up for the next release. I’ll just go where the winds of customer feedback take me.
Enjoy!
Baby Monitor Mode
A while back I refactored the start / stop / pause / resume app delegate code. I introduced a bug that prevented the app from correctly pausing when going into the background. I fixed the issue some months later. Some people, it turns out, viewed this bug as a feature.
The use case:
- Enable Background keep-alive in Streamie => Settings
- Start streaming one or more cameras
- Enable audio on each camera
- Lock your phone
- Go to sleep
- When your baby wakes up, you'll hear the audio.
The reason that I disabled this behavior, viewing it as a bug, is that the decoding layer and the display layer are both unhappy after the app returns to the foreground. To properly support it, I'd need to reset both of those layers in the streaming stack. Properly preventing this edge case seemed like the right move at the time.
A Streamie user reached out and asked me to consider reverting the change. I looked into it and determined that I could properly support it without too much mucking about. Additionally, while testing, I was interrupted multiple times by phone calls and I realized that I should also correctly support handling audio interruptions and route changes, so that’s all in place now as well. So, now you can listen to your cameras while Streamie is in the background, or your phone is locked. When you unlock your phone and return to Streamie, video will reconnect and resume. Thank you KH for the nudge in this direction.
Mode Schedule Visualizer
I set up a kinda complex not-during-business-hours schedule for a Streamie customer and ended up making a couple errors in the process. It wasn’t particularly intuitive to try to read and understand the several schedules that comprise the entire week. As a result, we now have the Mode Schedule Visualizer. You can, at a glance, get an understanding of the weekly schedule for a Mode.
This mode is tied to the motion event actions for each camera so that alerts only occur when the business is closed.
Event Filtering
You can now quickly search through your NAS recordings by filtering on events (if your camera supports events). ONVIF, UniFi and Rhombus cameras are generally supported. Event information is written to the recording along with audio/video packets. In the Recording Files screen, the Options button has the Enable Event Filtering option. Once enabled, you can edit event filtering to show only points in your recordings associated with a particular type of event (such as person detection or whatever else your camera supports).
This new filtering behavior is only supported on new recordings (v4.12.2 and after). The same information has been stored in recording files going back many version, but it was stored inline. The table of contents section of the recording file contains reference information for each event message, allowing Streamie to read that information, but each such read is a lengthy process. It was not adequately fast to make for a good user experience. Instead, all of the event messages are now stored in the appendix portion of the file, which is all read at once when opening each recording file.
Minimum Version
Versions of Streamie prior to v4.11.0 are no longer supported. The draw of deleting almost 12,000 lines of boilerplate code from the API server was too much to ignore any longer. Changes that impact backwards compatibility are fairly rare, thankfully. Dealing with this “technical debt” situation was a long time coming, and I’m glad it is done.
The nature of the change that resulted in the backwards compatibility cutoff had to do with the primary serialization mechanism used by Streamie. That same mechanism is used for writing NAS recording files. For the time being, Streamie will maintain backwards compatibility with playing old NAS recordings. Not forever though….
Adds
- Adds support for what I'm calling Baby Monitor Mode. For iOS, when you background the app while streaming (and listening) with the Background Keep-Alive setting enabled, video decoding and displaying stops but audio should remain. When resuming after being in the background, we reset the video decoders and streamer views, since they seem unhappy otherwise. The end result is that you should be able to listen to your cameras with Streamie in the background, or even with your phone locked.
- Adds support for the Mode Schedule Visualizer. This new section in the Mode screen will conveniently render a full week's schedule so you can easily make sure that you've accomplished what you want with the schedules you've defined.
- Adds support for filtering NAS recordings by specific event types. This required a few changes. First, event messages are no longer written in-line in the recordings. Instead, event messages are only included in the appendix (like snapshots). Second, the Recording Files screen now retrieves event messages (much like snapshots). Finally, when filtering is enabled, the user can now choose from a distinct set of event message topics to filter very specifically.
- Adds support to the Redirect Service for the new /release-notes endpoint that redirects to the latest release notes.
- Adds streaming session time limit. This time limit is imposed when the streaming session is displaying an uremovable module (ie, an upgrade nag).
Changes
- Changes the tvOS behavior when the app goes into the background (when background keep-alive is enabled), such that the streamer state remains as-is, and video / audio decoding and displaying resumes when the app returns to the foreground. I'm not sure I actually like this ... but we'll give it a try.
Fixes
- Fixes issues with correctly handling audio interruptions (such as when a phone call is received) and route changes, such that Streamie audio will resume when appropriate.
- Fixes (maybe) a Penguin crash. I've added a couple uses of weak self
instead of strongly capturing self. Yeah, that's mostly it. Plus some minor things that shouldn't impact it at all.
- Fixes a regression related to the upgrade nag that appears on the streaming screen. Due to prior efforts to make it unremovable, I also (accidentally) made it so that an upgraded account won't see the upgrade nag automatically removed. I have now found the healthy middle ground between these two extremes.
- Fixes a Penguin crash related to a collection mutation that occurs in a loop that iterates over that collection.
- Fixes a critical error in Penguin's StripeService where we were incorrectly checking for the existence of a purchase (and we were instead doing the opposite). Whoops!
- Fixes an issue where the reachable cache in ChinstrapService was not cleared when the app was put into the background / paused. I think this used to work as expected, but when I transitioned from PenguinService to ChinstrapService, the call got omitted.
- Fixes the done
cell width issues I created in the v4.12.1 release: iOS and tvOS now have better defaults and maximums.
- Fixes a massive mistake that I learned while trying to get CM's Apple TV back online. He was running v4.4.0 while Penguin was imposing a v4.10.0 minimum version. The problem was that even though I had updated Streamie on his Apple TV, the check Penguin was performing was for the app version associated with the already stored PenguinUser record, which couldn't be updated because the check occurred during the authentication process. So, I removed that check, added a "streamie-version" to the HTTP headers provided when connecting, added a check for that (when present) and added a check that occurs during the periodic update().
- Fixes an issue where the "Enable Audio" option was present in the contextual menu for Rhombus cameras, which (due to its RAW H.264 format) does not support audio.
- Fixes a Rhombus Service issue where changes to a Rhombus camera configuration would be overwritten by a cached copy any time an event message was received.
Improves
- Improves the AlertController behavior for detecting Delete-like buttons to mark as destructive.
- Improves the rendering of Help articles on the web with a horizontal rule following each h5 heading.
- Improves the user hints when entering an RTSP URL to further prevent common mistakes.
Removes
- Removes the bulk of ChinstrapCodableOld support -- some 12,000 lines of code. A little bit of it lingers due to it infecting some things semi-permanently. For instance, it is used when serializing a ChinstrapPermission to the database. It is also used for reading old NAS recordings. In the near future I can decide to remove support for reading old recordings, but even I have a bunch old recordings that will become unplayable, so I'm not in a huge hurry to get rid of this...and maintaining playback support doesn't really cause any issues.
- Removes a bunch of deprecated Penguin code.
Updates
- Updates the release notes link to point to the new v4.12.2 release notes document.
- Updates the icon files for Streamie on Mac. I'm not sure I dig having Streamie with no background color, but, we'll see.
- Updates the per-Router timer that checks for expired requests to have a weak instance of self (whoops!)
- Updates the merch link in the Other Upgrades screen for the stickers to the sheet of stickers instead of the custom cut single sticker that's insanely expensive.
- Updates the URL Camera Configure Screen (used for RTSP, RAW cameras) so that the absense of an explicit port number in the URL will cause a prompt that suggests a port number specific to the stream type.
- Updates updateFeatures() function so that the upgrade nag is now based on both the account age and app use (instead of just account age), given a user at least a minimum amount of app time before being confronted with upgrading.
- Updates 3rd party libraries.
- Updates the upgrade nag warning text to indicate that streaming sessions might be time limited.
- Updates the title text for the Help "All Topics" web page to "Streamie Support Topics".
Other
- Imports some code to handle doing fast-forward playback of NAS recordings. Everything is disabled, but preserved. I think the long term solution is going to involve just decoding and displaying key frames instead of trying to play all frames faster.
- Makes minor style updates to the https://help.streamieapp.com/a/pricing Help page.
- Stubs in some code for indexing and searching Help articles.
- Refactors AlertController: removes all instances of directly calling present(), in favor of a new showAlert() and hideAlert(). The initial motivation for this is to be able to trivially remove the animated=true
parameter (it takes too long to appear and looks silly) when hiding / showing. Long term, hopefully we can use this to easily customize how the alert is animated on / off the screen.
Created: 1 week ago
Updated: 4 days 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.