All notable changes to this project will be documented in this file.
Warning: Features marked as alpha may change or be removed in a future release without notice. Use with caution.
- Support for Paragraph Margins user setting.
- Improved performances of the search service used with EPUB.
- Support for Swift Package Manager (contributed by @stevenzeck).
- (alpha) A new Publication
SearchService
to search through the resources' content with a default implementationStringSearchService
. Link
objects from archive-based publication assets (e.g. an EPUB/ZIP) have additional properties for entry metadata."properties" { "archive": { "entryLength": 8273, "isEntryCompressed": true } }
- New
UserProperties.removeProperty(forReference:)
API to remove unwanted Readium CSS properties (contributed by @ettore).
- #139 Compile error with Xcode 12.4
- All APIs deprecated in previous versions are now unavailable.
DownloadSession
is deprecated and will be removed in the next major version. Please migrate to your own download solution.
Resource
has a new API to perform progressive asynchronous reads. This is useful when streaming a resource.HTTPFetcher
is a new publication fetcher able to serve remote resources through HTTP.- The actual HTTP requests are performed with an instance of
HTTPClient
.
- The actual HTTP requests are performed with an instance of
HTTPClient
is a new protocol exposing a high level API to perform HTTP requests.- It supports simple fetches but also progressive downloads.
DefaultHTTPClient
is an implementation ofHTTPClient
using standardURLSession
APIs. You can use its delegate to customize how requests are created and even recover from errors, e.g. to implement Authentication for OPDS.- You can provide your own implementation of
HTTPClient
to Readium APIs if you prefer to use a third-party networking library.
PublicationServiceContext
now holds a weak reference to the parentPublication
. This can be used to access other services from a givenPublicationService
implementation.- The default
LocatorService
implementation can be used to get aLocator
from a global progression in the publication.publication.locate(progression: 0.5)
- The
Archive
API now supports resource ownership at the entry level.- The default ZIP implementation takes advantage of this by opening a new ZIP stream for each resource to be served. This improves performances and memory safety.
- Improved performances when reading consecutive ranges of a deflated ZIP entry.
- HREF normalization when a resource path contains special characters.
PublicationAsset
is a new protocol which can be used to open a publication from various medium, such as a file, a remote URL or a custom source.File
was replaced byFileAsset
, which implementsPublicationAsset
.
Format
got merged intoMediaType
, to simplify the media type APIs.- You can use
MediaType.of()
to sniff the type of a file or bytes. MediaType
has now optionalname
andfileExtension
properties.- Some publication formats can be represented by several media type aliases. Using
mediaType.canonicalized
will give you the canonical media type to use, for example when persisting the file type in a database. All Readium APIs are already returning canonical media types, so it only matters if you create aMediaType
yourself from its string representation.
- You can use
ContentLayout
is deprecated, usepublication.metadata.effectiveReadingProgression
to determine the reading progression of a publication instead.
- The Publication Services API allows to extend a
Publication
with custom implementations of known services. This version ships with a few predefined services:PositionsService
provides a list of discrete locations in the publication, no matter what the original format is.CoverService
provides an easy access to a bitmap version of the publication cover.
- The Composite Fetcher API can be used to extend the way publication resources are accessed.
- Support for exploded directories for any archive-based publication format.
- Content Protection handles DRM and other format-specific protections in a more systematic way.
- LCP now ships an
LCPContentProtection
implementation to be plugged into theStreamer
. - You can add custom
ContentProtection
implementations to support other DRMs by providing an instance to theStreamer
.
- LCP now ships an
- A new
LinkRelation
type to represent link relations, instead of using raw strings.- This will improve code safety through type checking and enable code completion.
- Since
LinkRelation
conforms toExpressibleByStringLiteral
, you can continue using raw strings in the API. However, migrating your code is recommended, e.g.links.first(withRel: .cover)
. - Known link relations (including from OPDS specifications) are available under the
LinkRelation
namespace. You can easily add custom relations to the namespace by declaringstatic
properties in aLinkRelation
extension.
- The
Publication
andContainer
types were merged together to offer a single interface to a publication's resources.- Use
publication.get()
to read the content of a resource, such as the cover. It will automatically be decrypted if aContentProtection
was attached to thePublication
.
- Use
- The new Format API simplifies the detection of file formats, including known publication formats such as EPUB and PDF.
- A format can be "sniffed" from files, raw bytes or even HTTP responses.
- Reading apps are welcome to extend the API with custom formats.
- Using
Link.mediaType?.matches()
is now recommended to safely check the type of a resource. - More details about the Swift implementation can be found in the pull request.
- In
Publication
shared models:- Presentation Hints and HTML Locations extensions.
- Support for OPDS holds, copies and availability in
Link
, for library-specific features.
- (alpha) Audiobook toolkit:
AudioSession
simplifies the setup of anAVAudioSession
and handling its interruptions.NowPlayingInfo
helps manage the "Now Playing" information displayed on the lock screen.
- All the
Publication
shared models are now immutable, to improve code safety. This should not impact reading apps unless you createdPublication
or other models yourself. - The
DocumentTypes
API was extended and offers an easy way to check if your app supports a given file. - Dependencies to format-related third-party libraries such as ZIP, XML and PDF are being consolidated into
r2-shared-swift
. Therefore,r2-shared-swift
now depends on Fuzi and ZIPFoundation. This change will improve maintainability by isolating third-party code and allow (work in progress) to substitute the default libraries with custom ones.