Backport pull request #18283 from jellyfin/release-12.z

Fix EPUB metadata and covers not loading on Windows

Original-merge: 56989b0c80

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Cody Robibero <cody@robibe.ro>
This commit is contained in:
chino authored and Cody Robibero committed 2026-10-05 19:19:09 -04:00
1 parent 35cee77a98
commit f89279fc4b
4 files changed
+38 -3

No files matched your search

+1
View File
@@ -246,6 +246,7 @@
- [Mateus Bandeira](https://github.com/mateusbandeiraa)
- [excelsior](https://github.com/excelsior-dev)
- [TheDreadPirate](https://github.com/thedreaddpirate)
- [Daniel Aquino](https://github.com/chino)
- [klizas](https://github.com/klizas)
# Emby Contributors
@@ -64,7 +64,8 @@ namespace MediaBrowser.Providers.Books.OpenPackagingFormat
}
var cover = coverReference.Value;
var coverFile = epub.GetEntry(cover.Path);
// ZIP entry names always use '/', but the cover path is built with Path.Combine, which uses '\' on Windows
var coverFile = epub.GetEntry(cover.Path.Replace('\\', '/'));
if (coverFile == null)
{
@@ -1,4 +1,3 @@
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Xml.Linq;
@@ -17,7 +16,7 @@ namespace MediaBrowser.Providers.Books.OpenPackagingFormat
/// <returns>The content file path.</returns>
public static string? ReadContentFilePath(ZipArchive epub)
{
var container = epub.GetEntry(Path.Combine("META-INF", "container.xml"));
var container = epub.GetEntry("META-INF/container.xml");
if (container == null)
{
return null;
@@ -0,0 +1,34 @@
using System.IO;
using System.IO.Compression;
using System.Text;
using MediaBrowser.Providers.Books.OpenPackagingFormat;
using Xunit;
namespace Jellyfin.Providers.Tests.Books;
public class EpubUtilsTests
{
[Fact]
public void ReadContentFilePath_ReadsRootFileFromContainer()
{
using var stream = new MemoryStream();
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
{
using var writer = new StreamWriter(archive.CreateEntry("META-INF/container.xml").Open(), Encoding.UTF8);
writer.Write(
"""
<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
<rootfiles>
<rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/>
</rootfiles>
</container>
""");
}
stream.Position = 0;
using var epub = new ZipArchive(stream, ZipArchiveMode.Read);
Assert.Equal("OEBPS/content.opf", EpubUtils.ReadContentFilePath(epub));
}
}