Skip to content

Releases: SRGSSR/pillarbox-apple

SRG SSR monitoring and Low Data Mode support

14 Nov 07:09
6.0.0
925325b
Compare
Choose a tag to compare

This release adds monitoring for SRG SSR content. It also introduces new APIs to better manage data in constrained environments, with support for Low Data Mode and upper bounds that can be set on content bitrate and resolution.

Recent API changes introduced for playlists in 4.0.0 have also been rollbacked. These APIs failed to deliver the convenient model / playlist synchronization they were introduced for.

Monitoring

  • SRG SSR core business player items are monitored automatically. The collected data covers a wide range of Quality of Service / Quality of Experience needs and, even though all data is anonymous, you should ensure that your app privacy details are updated accordingly if needed.

Support for constrained data environments

  • ImageSource supports standard and low-resolution image URLs. When provided these are automatically loaded when Low Data Mode has been enabled for a network.
  • Core business player items retrieve low-resolution images when Low Data Mode has been enabled for a network.
  • The player configuration has been extended with a allowsConstrainedNetworkAccess to prevent playback for non-essential content when Low Data Mode has been enabled.
  • PlayerLimits can be freely defined to set upper bounds on content bitrate and resolution. This makes it possible to implement data-saving modes. Note that no lower bounds can be set, as the player must remain free to use available lower-quality variants to ensure an uninterrupted playback experience.

Miscellaneous improvements

  • Provide a way to optionally attach metadata to unavailable Assets.
  • Attach metadata to core business player items which are unavailable for a business reason (e.g. content not available yet).
  • Make Player.currentItem a published property.

Breaking changes

  • The source parameter associated with PlayerItems has been removed.
  • The corresponding Playlist parameter has been removed.

Fixes

  • Fix erratic change observability when changing legible media options.
  • Hide RoutePickerView for iPad apps running on macOS.

Demo improvements

  • Add quality switch to the custom player layout settings menu.
  • Add similar setting to the global demo settings. This setting is applied throughout the demo where appropriate.
  • Improve demo overall accessibility via VoiceOver.

What's changed

Full Changelog: 5.0.0...6.0.0

Picture in Picture stability improvements

11 Oct 13:56
5.0.0
be9f641
Compare
Choose a tag to compare

Warning

Sources associated with player items, introduced in version 4.0.0, will be removed in version 6.0.0. Please avoid using them in your code.

This release improves Picture in Picture support in advanced scenarios involving several video views supporting it, avoiding unexpected playback interruptions in some cases.

Picture in Picture fixes and improvements

  • Improve Picture in Picture stability in complex view hierarchies involving several supporting VideoViews or SystemVideoViews.
  • Add method to start Picture in Picture programmatically. This method must only be called in response to some form of user interaction.
  • Add PictureInPicturePersistable method informing implementations that Picture in Picture has been closed from the Picture in Picture overlay.

Miscellaneous improvements

  • Remove VideoView internal animations when loading content. If applications desire such animations they can animate the video view directly.
  • Adjust monitoring data.
  • Update comScore SDK to its most recent version.

Breaking changes

  • Chapters associated with a media composition are provided by MediaMetadata, not MediaComposition directly anymore.

Fixes

  • Fix glitches affecting VideoView during animations.
  • Fix Control Center restoration after mixable to non-mixable audio session transitions on iOS and tvOS 16 / 17 devices.
  • Avoid pausing playback when a monoscopic video view is destroyed.
  • Fix crashes when loading URNs for which a main chapter is not available from the associated media composition chapter list.

Demo improvements

  • Add iOS 18 dark and tinted icons.

Performance issue fix

04 Sep 09:43
9b8a202
Compare
Choose a tag to compare

Improvement

  • Improve Playlist component.

Fix

  • Fix date retrieval performance issue with some content (e.g. MP3).

What's Changed

  • Fix date retrieval performance issue with some content by @defagos in #997
  • Replace lists with forms where appropriate by @defagos in #998
  • Enhance the Playlist component by @waliid in #1002

Full Changelog: 3.0.0...4.0.0

Metrics, monitoring and improved playlist support

30 Aug 17:21
3.0.0
2190f45
Compare
Choose a tag to compare

This release mostly focuses on metrics and monitoring. It makes it possible to inspect and monitor playback performance, both locally and remotely.

It also improves features associated with playlists, adding looping playback as well as a simpler way to manage items in a playlist at the user interface level.

Metrics

  • Provide several key metrics during playback (bitrates, stalls, data requests, frame drops, etc.). Current metrics can be queries from PlayerProperties at any time, or obtained periodically using periodicMetricsPublisher(forInterval:queue:limit:).
  • Receive important events during playback (metadata and asset loading, errors, stalls, etc.) by subscribing to the metricEventsPublisher publisher.
  • The MetricsCollector observable object lets you easily create metrics visualizations, e.g. using SwiftUI or Swift Charts.

Monitoring

  • Add PillarboxMonitoring package, offering seamless integration with Pillarbox monitoring platform.
  • Provide MetricsTracker to automatically collect and send metrics data to Pillarbox monitoring platform.

Tracking

  • Make trackers easier to implement with reliable access to properties when a tracker is disabled.
  • Add metrics protocol method to PlayerItemTracker.
  • Add optional and mandatory behaviors to tracker adapters, letting you control how isTrackingEnabled affects them.
  • Add support for optional session identifiers, letting you associate an identifier with a tracker, useful to relate data remotely collected by a tracker with an associated local session.

Playlist support

  • The items of a Player can be simply displayed as a Playlist supporting usual actions (reorder, delete).
  • A source can be associated to items, making it possible to display any kind of relevant data in a playlist user interface.
  • Repeated playback of a single item or of an entire playlist can be enabled with the new repeatMode player property.

Miscellaneous improvements

  • Add date support for streams embedding timestamps. A seek method accepting a date as parameter has been enabled and a date() method has been added to retrieve the current date.
  • Make smart navigation interval configurable.
  • Improve server support in CoreBusiness by adding support for custom server URLs and query parameters.
  • Add Audio Description information to Commanders Act analytics labels.
  • Add date interval measurement operator to the Core package.
  • Add stopwatch to the Core package.
  • Remove Timelane.

Breaking changes

  • Update PlayerItemTracker protocol method signatures. Implementations can also be made simpler using properties now provided when a tracker is disabled.
  • PlayerConfiguration navigation mode is now set through a navigationMode property instead of a simple Boolean flag.
  • Commanders Act and comScore events captured do not require a leading dot anymore.
  • The player current item is set using currentItem. The index-based currentIndex and setCurrentIndex(_:) APIs have been removed accordingly.
  • The current time was retrieved from a time property which, for consistency, has been replaced with a time() function.

Fixes

  • Make User Agent reliable in Commanders Act events.

Demo improvements

  • Make tvOS Playback HUD, displaying various streaming key metrics, also available on iOS. The HUD can be enabled and customized under the demo Settings tab.
  • Add metrics debugging view to the main custom player layout, accessible from its settings menu.
  • Provide more entry options for custom URL and URN entry (token, DRM, server).
  • Make the custom player slider accessible with VoiceOver.
  • Add basic keyboard shortcut support.
  • Add BBC and Mux test streams.
  • Display metrics session identifier when a failure is encountered while playing SRG SSR content. This makes it possible to relate a playback session to data visualized remotely.
  • Improve automatic keyboard dismissal.

What's changed

Read more

Improved metadata support

16 May 07:51
2.0.0
59afca0
Compare
Choose a tag to compare

This release improves support for metadata. This includes features for displaying content information and artworks in custom layouts, but also features that can enhance the user experience during playback.

Metadata

  • Player provides metadata updates through a new metadata published property. Use this metadata to easily display information about the content being played in custom user interfaces.
  • Chapters can be associated with content being played. Those provide markers into the content, which can be used for display purposes or to offer alternative ways to navigate the content.
  • Images are now retrieved by the player directly and do not need to be loaded by a PlayerItem custom publisher anymore (though they still can if this approach is more appropriate). The main artwork for a content as well as images associated with chapters must be provided as ImageSources. URL-based sources are automatically fetched by the player when actually needed, avoiding unnecessary fetches when not used.

Blocked time ranges

  • Optionally associate blocked time ranges with content being played. These time ranges are automatically skipped during playback. Seeking into them is prevented as well.
  • Blocked time ranges are displayed as interstitials in the tvOS system playback user interface.

Opening and end credits

  • Define time ranges associated with opening and closing credits. These time ranges can be used in custom user interfaces, e.g. to display a skip button during credits.

User interface

  • Add support for contextual actions to SystemVideoView.
  • Use LazyImage in SwiftUI layouts to display images lazily loaded from an ImageSource. Use LazyUIImage where a UIImage is required instead.

SRG SSR content support improvements

  • Prevent playback of time ranges blocked by SRG SSR editors, instead of preventing playback of the whole content.
  • Extract chapters from SRG SSR content.
  • Display season / episode information in the tvOS system playback user interface.
  • Increase artwork image quality for SRG SSR content.

Miscellaneous

  • Update translations.
  • Add Player.seek(to:completion:) method to seek to a chapter.
  • Add PlayerConfiguration.default to obtain default player configuration settings.
  • Add `Publisher.delayIfNeeded(for:tolerance:scheduler:options:).
  • Make subscript(safeIndex:) available for all Arrays.

Breaking changes

  • Improve CMTime and CMTimeRange consistency in ProgressTracker, returning .invalid instead of nil when values are not available. Please update your code to check if a time or range isValid rather than testing for nullability.
  • PlayerItem configuration now happens with a dedicated PlayerItemConfiguration parameter, not with a closure anymore.

Fixes

  • Avoid undesired automatic Control Center integration on iOS when using the system playback user interface.
  • Fix Control Center integration on tvOS.
  • Fix incorrect times returned by a ProgressTracker when playing a DVR livestream at the live edge.

Demo improvements

  • Display chapters in the custom player user interface on iOS.
  • Display audio artworks in the custom player user interface on iOS.
  • Make satellite radio streams available (Radio Swiss Pop, Radio Swiss Jazz and Radio Swiss Classic).
  • Add examples for integration of a skip button during credits.
  • Display blocked time ranges in the custom player slider on iOS.
  • Improve the playlist example on tvOS.

Demo fixes

  • Improve interactions with the demo custom slider.
  • Fix custom player interface animation glitches.
  • Prevent the custom player user interface from being toggled while scrubbing.
  • Fix player settings not applied until the application is restarted.

What's changed

  • Deliver player metadata by @waliid in #808
  • Remove superfluous icon by @defagos in #811
  • Fix unreliable test by @defagos in #812
  • Introducing a user-friendly API for AVMetadataItem construction by @waliid in #809
  • Polish implementation and documentation by @defagos in #814
  • Add a TestFlight badge by @waliid in #821
  • Improve metadata delivery by @waliid in #827
  • Update translations from Crowdin by @defagos in #828
  • Fix tvOS Control Center by @waliid in #829
  • Update examples by @defagos in #830
  • Display metadata in the iOS custom player by @waliid in #831
  • Display chapters in iOS demo by @waliid in #832
  • Rename ChapterMetadata to Chapter by @waliid in #833
  • Improve chapter cell appearance by @defagos in #834
  • Document metadata integration by @defagos in #835
  • Enable advanced Picture in Picture and Control Center integration for the chapter-supporting player by @defagos in #836
  • Remove chapters with non-matching media type by @defagos in #838
  • Add test for mixed chapter filtering by @defagos in #841
  • Never return chapters for audio content by @defagos in #842
  • Return invalid times and ranges consistently with other player APIs by @defagos in #847
  • Fix assertion raised when formatting invalid times by @defagos in #848
  • Support opening and end credits by @waliid in #850
  • Handle blocked time ranges by @waliid in #853
  • Enable chapter support in the main custom player layout by @defagos in #855
  • Improved tvOS playlist experience by @defagos in #856
  • Add demo privacy manifest by @defagos in #857
  • Fix documentation link by @defagos in #858
  • Manage image retrieval at the player level by @defagos in #860
  • Fix undesired seek in overlapping time ranges by @defagos in #863
  • Display time ranges on custom slider by @waliid in #864
  • Add blocked time range URN example by @defagos in #865
  • Display artwork image for audio by @defagos in #866
  • Add a test for nested time range by @waliid in #868
  • Use new API for localization by @waliid in #869
  • Add journalistic blocking reason by @defagos in #871
  • Add HLS documentation links by @defagos in #870
  • Apply current demo settings to player instances by @defagos in #872
  • Prevent controls from being toggled while interacting by @defagos in #874
  • Disable automatic now playing info updates on iOS by @defagos in #875
  • Fix Control Center integration documentation on tvOS by @defagos in #877
  • Load chapters and artwork images lazily by @waliid in #879
  • Fix capped times delivered by a progress tracker at the live edge by @defagos in #880
  • Document metadata integration by @defagos in #882
  • Fix undesired animation by @waliid in #881
  • Avoid settings menu being closed when controls disappear by @defagos in #883
  • Align the loading indicator to the right when the UI is hidden by @waliid in #886

Full Changelog: 1.0.1...2.0.0

Performance issue fix

13 Mar 18:06
edfcb80
Compare
Choose a tag to compare

Fixes

  • Fix a resource leak which could lead to performance issues over time.

What's changed

  • Fix resource leak in ReplaySubject by @waliid in #802

Full Changelog: 1.0.0...1.0.1

First official release 🎉

13 Mar 11:54
5b48717
Compare
Choose a tag to compare

Important

Letterbox will be sunset in August 2025:

  • New SRG SSR products must use Pillarbox only.
  • Existing SRG SSR products using Letterbox must transition to Pillarbox before this date.

This is the first official release of Pillarbox for Apple platforms. Pillarbox is the modern SRG SSR media playback ecosystem, a generational leap over its predecessor Letterbox.

Tip

Should you have questions, ideas, or should you need assistance, please use our issue tracker or a dedicate discussion.

Features

Refer to our documentation for a complete feature list.

Tip

Articles, tutorials and developer documentation are available right within Xcode as a documentation catalog.

Fixes and improvements

If you were already integrating a pre-release version of Pillarbox, this first official release adds a few final fixes and improvements:

  • Fix an issue sometimes preventing metadata from being correctly displayed in the Control Center.
  • Update comScore and Commanders Act libraries to the most recent releases.
  • Improve documentation and remove unused files.
  • Fix missing translations.
  • Add privacy manifests.

What's Changed

Full Changelog: 0.11.0...1.0.0

Improved error management in playlists

05 Mar 13:33
0.11.0
3516578
Compare
Choose a tag to compare
Pre-release

This release improves support for long playlists.

Improvements

  • Improve error management in playlists.
  • Improve Control Center integration in presence of error:
    • Display errors in the Control Center directly.
    • Allow users to retry playback after a failure directly from the Control Center.
  • Add actionAtItemEnd player setting, with which the behavior when playback of an item ends can be customized.

Fixes

  • Resolve several analytics issues in playlists:
    • Fix an issue leading to Commanders Act events missing a playback position.
    • Fix incorrect event transitions emitted when chaining items in a playlist.
    • Fix incorrect event transitions emitted when moving the item currently being played.
  • Fix incorrect playback position reported when dynamically enabling Control Center integration during playback.

Demo improvements

  • Improve slider interactions.

Demo fixes

  • Fix missing content image.

What's changed

  • Fix incorrectly received tracker property updates by @defagos in #770
  • Fix broken image link by @waliid in #771
  • Improve demo slider by @defagos in #772
  • Improve Control Center display in presence of errors by @waliid in #769
  • Force simulator language and region by @defagos in #778
  • Fix incorrect time position after disabling and enabling Control Center integration by @waliid in #779
  • Support standard actions at item playback end by @waliid in #780
  • Avoid unnecessary Commanders Act seek / play transitions by @defagos in #781
  • Prepare for complete localization by @defagos in #782
  • Remove CombineExt by @defagos in #783

Full Changelog: 0.10.0...0.11.0

Improved support for long playlists

13 Feb 08:36
0.10.0
801834e
Compare
Choose a tag to compare
Pre-release

This release improves support for long playlists.

Improved support for long playlists

Prior to this version Pillarbox player was eagerly loading all items in a playlists. This was leading to unnecessary metadata retrieval (potentially including artworks) as well as potential player hangs, most notably with MP3 playlists.

To solve these issues Pillarbox player now only loads two items at any given time. This still ensures that content can be preloaded in advance during normal playback, ensuring gapless playback when possible, while minimizing resource waste and avoiding performance issues.

Improvements

  • Display metadata in the SystemVideoView.
  • Stop playback on failed items in playlists.
  • Ensure all skips are non-smooth.
  • Optimized threads created by SRG SSR standard trackers.
  • Ensure common unique identifiers with Letterbox and Pillarbox versions that were running Commanders Act SDK version 4.
  • Provide specific analytics device information for iPad applications run on macOS.

Fixes

  • Make it possible to restart playback of items whose metadata delivery failed.
  • Avoid undesired layer animations when resizing the video view.
  • Fix Swift Package Index documentation generation.

Breaking changes

  • Rename isRunning as shouldPlay.

Demo improvements

  • Add long-press gesture to enable high-speed playback.
  • Update Pillarbox web demo link.

Demo fixes

  • Fix monoscopic content display in playlist demos.
  • Fix page views incorrectly sent during scrolling.

What's changed

  • Eliminate undesired layer animations by @waliid in #726
  • Extend layout past the safe area by @defagos in #727
  • Rename isRunning as shouldPlay by @defagos in #732
  • Make all skips consistently non-smooth by @defagos in #731
  • Fix replay behavior with unconsumed failed items by @defagos in #734
  • Update start time example for consistency with other platforms by @defagos in #733
  • Add metadata to the system player by @waliid in #735
  • Avoid sending several page views to the analytics by @waliid in #737
  • Avoid starting from an incorrect position in terms of analytics by @waliid in #739
  • Update SwiftLint to version 0.54.0 by @defagos in #741
  • Fix pre-commit hook by @defagos in #742
  • Document how to trust plugins in a continuous integration setup by @defagos in #740
  • Avoid unnecessary thread creation by item trackers by @defagos in #743
  • Fix comScore test flakiness by @waliid in #744
  • Increase playback speed during a long press gesture by @waliid in #746
  • Use common Commanders Act unique identifier between v4 and v5 by @defagos in #752
  • Support desktop as navigation device by @defagos in #751
  • Update data provider to version 19.0.0 by @defagos in #755
  • Fix unresponsive AirPlay button by @waliid in #754
  • Fix incorrect navigation title by @defagos in #758
  • Fix Swift Package Index documentation generation by @defagos in #759
  • Update links for web player and demo by @defagos in #761
  • Disable high speed gesture for monoscopic content by @defagos in #762
  • Fix monoscopic support in playlists by @defagos in #763
  • Remove web player link by @defagos in #765
  • Improve support for long playlists by @defagos in #766

Full Changelog: 0.9.0...0.10.0

Monoscopic 360° video support

09 Jan 12:28
0.9.0
c7285ee
Compare
Choose a tag to compare
Pre-release

This release adds support for monoscopic 360° video and further improves Picture in Picture behavior.

360° video support

  • Add support for monoscopic 360° videos to VideoView. Use the new VideoView/viewport(_:) modifier to enable 360° display and choose and set an orientation in space.
  • Orientation in space requires a quaternion. Two SCNQuaternionRotate(_:_:_:) and SCNQuaternionWithAngleAndAxis(_:_:_:_:) functions are provided to help build relevant quaternions, most notably for controlling the viewport through touch events. On iOS the SCNQuaternionForAttitude(_:) function makes it possible to bridge quaternions delivered by CoreMotion with SceneKit quaternions required used by Pillarbox.

Picture in Picture improvements

  • Improve Picture in Picture integration and overall behavior.
  • Introduce PictureInPicturePersistable that lets app locally respond to Picture in Picture life cycle events if needed.

Improvements

  • Add playback speed menu to the tvOS system player view layout.
  • Add AVPlayerItem/seek(_:) method to set a player item to start at a given time.
  • Add Player/isRunning property.
  • Improve documentation and tutorials.

Demo improvements

  • Greatly improve tvOS navigation user experience.
  • Improve Picture in Picture integration in demo examples.
  • Display Pillarbox web demo in a web browser. This feature is not intended to be easily accessible and requires a dedicated opt-in to be enabled in app system settings first.

Fixes

  • Update Swift package manifest version to 5.9.

Breaking changes

  • Prefix all frameworks with Pillarbox to avoid potential naming conflicts with packages providing frameworks having the same name.
  • Update in-app Picture in Picture in-app integration API. The View/enabledForInAppPictureInPictureWithCleanup(perform:) method has been replaced with the View/enabledForInAppPictureInPicture(persisting:) method which, instead of executing a closure to cleanup resources associated with a player (potentially after Picture in Picture ends), ensures a PictureInPicturePersistable object is kept alive during Picture in Picture playback. The PictureInPicturePersistable protocol can be optionally used to locally respond to Picture in Picture lifef cycle events as well.
  • Update VideoView and SystemVideoView APIs so that optional behaviors (gravity, Picture in Picture support) are configured with modifiers instead of parameters.

What's Changed

Full Changelog: 0.8.0...0.9.0