Skip to content

Commit f5cd4b9

Browse files
authored
Simplify RWPM parsing for packaged publications (#380)
1 parent 8d06db3 commit f5cd4b9

File tree

6 files changed

+21
-86
lines changed

6 files changed

+21
-86
lines changed

readium/lcp/src/main/java/org/readium/r2/lcp/service/LicensesService.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import org.readium.r2.shared.asset.AssetRetriever
3434
import org.readium.r2.shared.extensions.tryOr
3535
import org.readium.r2.shared.publication.protection.ContentProtection
3636
import org.readium.r2.shared.util.Try
37+
import org.readium.r2.shared.util.mediatype.FormatRegistry
3738
import org.readium.r2.shared.util.mediatype.MediaType
3839
import timber.log.Timber
3940

@@ -260,12 +261,5 @@ internal class LicensesService(
260261
}
261262

262263
private val MediaType.fileExtension: String get() =
263-
when {
264-
matches(MediaType.DIVINA) -> "divina"
265-
matches(MediaType.EPUB) -> "epub"
266-
matches(MediaType.LCP_PROTECTED_PDF) -> "pdf"
267-
matches(MediaType.READIUM_AUDIOBOOK) -> "audiobook"
268-
matches(MediaType.READIUM_WEBPUB) -> "webpub"
269-
else -> "epub"
270-
}
264+
FormatRegistry().fileExtension(this) ?: "epub"
271265
}

readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaSessionNavigator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ private val skipBackwardInterval: Duration = 30.seconds
4545
@OptIn(ExperimentalTime::class)
4646
public class MediaSessionNavigator(
4747
override val publication: Publication,
48-
internal val publicationId: PublicationId,
49-
private val controller: MediaControllerCompat,
48+
public val publicationId: PublicationId,
49+
public val controller: MediaControllerCompat,
5050
public var listener: Listener? = null
5151
) : MediaNavigator, CoroutineScope by MainScope() {
5252

readium/shared/src/main/java/org/readium/r2/shared/publication/Manifest.kt

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -155,28 +155,23 @@ public data class Manifest(
155155
*/
156156
public fun fromJSON(
157157
json: JSONObject?,
158-
packaged: Boolean = false,
159158
mediaTypeRetriever: MediaTypeRetriever = MediaTypeRetriever(),
160159
warnings: WarningLogger? = null
161160
): Manifest? {
162161
json ?: return null
163162

164163
val baseUrl =
165-
if (packaged) {
166-
"/"
167-
} else {
168-
Link.fromJSONArray(
169-
json.optJSONArray("links"),
170-
mediaTypeRetriever,
171-
warnings = warnings
172-
)
173-
.firstWithRel("self")
174-
?.href
175-
?.toUrlOrNull()
176-
?.removeLastComponent()
177-
?.toString()
178-
?: "/"
179-
}
164+
Link.fromJSONArray(
165+
json.optJSONArray("links"),
166+
mediaTypeRetriever,
167+
warnings = warnings
168+
)
169+
.firstWithRel("self")
170+
?.href
171+
?.toUrlOrNull()
172+
?.removeLastComponent()
173+
?.toString()
174+
?: "/"
180175

181176
val normalizeHref = { href: String -> Href(href, baseUrl).string }
182177

@@ -199,13 +194,6 @@ public data class Manifest(
199194
normalizeHref,
200195
warnings
201196
)
202-
.map {
203-
if (packaged && "self" in it.rels) {
204-
it.copy(rels = it.rels - "self" + "alternate")
205-
} else {
206-
it
207-
}
208-
}
209197

210198
// [readingOrder] used to be [spine], so we parse [spine] as a fallback.
211199
val readingOrderJSON = (json.remove("readingOrder") ?: json.remove("spine")) as? JSONArray

readium/shared/src/test/java/org/readium/r2/shared/publication/ManifestTest.kt

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -268,53 +268,12 @@ class ManifestTest {
268268
}
269269

270270
@Test
271-
fun `self link is replaced when parsing a package`() {
272-
assertEquals(
273-
Manifest(
274-
metadata = Metadata(localizedTitle = LocalizedString("Title")),
275-
links = listOf(Link(href = "/manifest.json", rels = setOf("alternate")))
276-
),
277-
Manifest.fromJSON(
278-
JSONObject(
279-
"""{
280-
"metadata": {"title": "Title"},
281-
"links": [
282-
{"href": "/manifest.json", "rel": ["self"], "templated": false}
283-
]
284-
}"""
285-
),
286-
packaged = true
287-
)
288-
)
289-
}
290-
291-
@Test
292-
fun `self link is kept when parsing a remote manifest`() {
293-
assertEquals(
294-
Manifest(
295-
metadata = Metadata(localizedTitle = LocalizedString("Title")),
296-
links = listOf(Link(href = "/manifest.json", rels = setOf("self")))
297-
),
298-
Manifest.fromJSON(
299-
JSONObject(
300-
"""{
301-
"metadata": {"title": "Title"},
302-
"links": [
303-
{"href": "/manifest.json", "rel": ["self"]}
304-
]
305-
}"""
306-
)
307-
)
308-
)
309-
}
310-
311-
@Test
312-
fun `href are resolved to root when parsing a package`() {
271+
fun `href are resolved to root with a relative self link`() {
313272
val json = JSONObject(
314273
"""{
315274
"metadata": {"title": "Title"},
316275
"links": [
317-
{"href": "http://example.com/manifest.json", "rel": ["self"], "templated": false}
276+
{"href": "manifest.json", "rel": ["self"], "templated": false}
318277
],
319278
"readingOrder": [
320279
{"href": "chap1.html", "type": "text/html", "templated": false}
@@ -324,7 +283,7 @@ class ManifestTest {
324283

325284
assertEquals(
326285
"/chap1.html",
327-
Manifest.fromJSON(json, packaged = true)?.readingOrder?.first()?.href
286+
Manifest.fromJSON(json)?.readingOrder?.first()?.href
328287
)
329288
}
330289

readium/streamer/src/main/java/org/readium/r2/streamer/ParserAssetFactory.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import org.readium.r2.shared.publication.Publication
1515
import org.readium.r2.shared.resource.Resource
1616
import org.readium.r2.shared.resource.ResourceContainer
1717
import org.readium.r2.shared.resource.RoutingContainer
18-
import org.readium.r2.shared.resource.StringResource
1918
import org.readium.r2.shared.util.MessageError
2019
import org.readium.r2.shared.util.ThrowableError
2120
import org.readium.r2.shared.util.Try
@@ -65,7 +64,7 @@ internal class ParserAssetFactory(
6564
private suspend fun createParserAssetForManifest(
6665
asset: Asset.Resource
6766
): Try<PublicationParser.Asset, Publication.OpeningException> {
68-
val manifest = asset.resource.readAsRwpm(packaged = false)
67+
val manifest = asset.resource.readAsRwpm()
6968
.mapFailure { Publication.OpeningException.ParsingFailed(ThrowableError(it)) }
7069
.getOrElse { return Try.failure(it) }
7170

@@ -87,10 +86,7 @@ internal class ParserAssetFactory(
8786

8887
val container =
8988
RoutingContainer(
90-
local = ResourceContainer(
91-
path = "/manifest.json",
92-
resource = StringResource(manifest.toJSON().toString(), asset.mediaType)
93-
),
89+
local = ResourceContainer(path = "/manifest.json", asset.resource),
9490
remote = HttpContainer(httpClient, baseUrl)
9591
)
9692

@@ -118,14 +114,13 @@ internal class ParserAssetFactory(
118114
)
119115
}
120116

121-
private suspend fun Resource.readAsRwpm(packaged: Boolean): Try<Manifest, Exception> =
117+
private suspend fun Resource.readAsRwpm(): Try<Manifest, Exception> =
122118
try {
123119
val bytes = read().getOrThrow()
124120
val string = String(bytes, Charset.defaultCharset())
125121
val json = JSONObject(string)
126122
val manifest = Manifest.fromJSON(
127123
json,
128-
packaged = packaged,
129124
mediaTypeRetriever = mediaTypeRetriever
130125
)
131126
?: throw Exception("Failed to parse the RWPM Manifest")

readium/streamer/src/main/java/org/readium/r2/streamer/parser/readium/ReadiumWebPubParser.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ public class ReadiumWebPubParser(
4444

4545
val manifest = Manifest.fromJSON(
4646
manifestJson,
47-
packaged = true,
4847
mediaTypeRetriever = mediaTypeRetriever
4948
)
5049
?: return Try.failure(

0 commit comments

Comments
 (0)