Wie konvertiert man ein epub-Paket in normales epub?

Ich habe einige epub-Dateien in meinem iCloud Drive, die im Wesentlichen Pakete sind. Ich kann Paketinhalte anzeigen und dann zeigt es mir eine Hierarchie von Dateien und Ordnern.

Wie kann ich diese Struktur in ein Standard-epub umwandeln, das jeder normale epub-Reader verstehen wird?

(Dies könnte eine Antwort sein) Haben Sie versucht, das ePub direkt von Ihrem iCloud-Laufwerk in Ihren ePub-Reader einzufügen?
Ja, ich habe diesen @Brick ausprobiert, aber sie werden wie oben erwähnt als Ordner angezeigt ...
Wie in, wird es richtig wie beabsichtigt im Reader angezeigt?
Nein, sie werden als Ordner statt als Buch angezeigt. Sie geben einfach eine Ordnerhierarchie vor. Ich hatte mir gedacht, dass vielleicht ein epub-Ordner nur komprimiert und dann vielleicht passend umbenannt werden müsste ...

Antworten (6)

So importiert iBooks eine ePub-Datei:

Eine .epubDatei ist, wie in anderen Antworten erwähnt, im Wesentlichen eine gezippte Datei. Wenn iBooks.epub die Datei importiert , .epubist die darin gespeicherte Datei eine entpackte Datei. Dies erklärt, warum es die Show Package ContentsOption gibt, mit der Sie die "entpackten" Dateien durchsuchen können. Es funktioniert jedoch nicht immer, das Paket einfach zu komprimieren.

Neuerstellung der .epubDatei aus dem Paket :

Manuell:

  1. Right clickauf die .epubDatei und klicken Sie auf Show Package Contents.
  2. Wählen Sie den gesamten Inhalt ( CMD+ A) → Right clickCompress.
  3. Dadurch wird eine Datei erstellt .zip. Ändern Sie einfach die Erweiterung von .zipzu .epubund voila! Die Datei ist zu einem ePub- Dokument geworden.

Automatisierung:

Ich hatte mehr als 2.000 .epub Pakete, die ich in .epub Dateien konvertieren wollte , daher war die obige Methode nicht machbar. Um die manuelle Arbeit zu vermeiden, habe ich ein Skript geschrieben, das im Wesentlichen die obige Methode für alle Dateien ausführt. Ich habe den einfachen und eleganten Shell-Code verwendet , der hier von Matthias bereitgestellt wird, und ihn in ein pythonunten geteiltes Skript verpackt:

# Convert epub packages to epub files
import os
import subprocess

filenames = []
path_to_files = ""
#   Function to store all filenames in a list
def extract_filename(path_to_files):    # "/Users/****/Desktop/Old_epubs"
    os.chdir(path_to_files)
    books = os.getcwd()
    for f in os.listdir(books):
        f_name, f_ext = os.path.splitext(f)
        if f_ext == ".epub":
            filenames.append(f_name)

    filenames.sort()

#   Function to generate new epub files
def create_epub(path_to_new_files): # "/Users/****/Desktop/new_epubs/"
    total_files = len(filenames)
    for i in range(total_files):
        epub_path = "cd " + path_to_files
        filename = filenames[i] + ".epub"
        zipping = " zip -X -r " + path_to_new_files + filename + " mimetype *"
        plist = "rm iTunesMetadata.plist"
        comm = epub_path + filename + "; " + plist + "; " + zipping
        p1 = subprocess.run(comm, capture_output = True, text = True, shell = True)
        success = p1.returncode
        if success == 0:
            rem_files = total_files - i + 1
            print("File #", i+1, " has been processed successfully. Remaining files: ", rem_files)

#   Enter the paths
extract_filename("/Users/****/Desktop/Books")   # Path to directory containing epub packages
create_epub("/Users/****/Desktop/new_epubs/")   # Path to store new epub files in

Die extract_filenameFunktion führt eine pathin ein Verzeichnis, das die .epub Pakete enthält , die konvertiert werden müssen. [WARNUNG] Es ist am besten, an einer Kopie der .epubPakete zu arbeiten, falls etwas schief geht. Sicherheitshalber einfach die Pakete in ein anderes Verzeichnis kopieren und daran arbeiten.

Die create_epubFunktion führt pathin ein Verzeichnis, in dem Sie die generierten Dateien speichern möchten. Es führt dann einen shellBefehl aus, um jedes .epub Paket zu öffnen und eine .epub Datei zu generieren .


Hoffe das hilft! Es hat sicherlich ein großes Problem von mir gelöst.

FWIW, hier ist ein Shell-Befehl, der funktioniert:

 cd my-broken.epub

 # iTunes/Books seems to add a file 
 # 'iTunesMetadata.plist', and it produces a warning.
 # May also contain private data, so better delete it.

 rm iTunesMetadata.plist 

 zip -X -r ../fixed.epub mimetype *

Soweit ich das beurteilen kann, muss die Komprimierung nicht deaktiviert werden ( -0). epubcheckhat keine Beschwerden. Es kann jedoch Unterschiede zwischen den Versionen der epub-Spezifikation geben. Mein Test war mit einer epub 3.0-Datei.

✊🏽 Das Beste ✊🏽
Diese Lösung für mich!
Das hat bei mir funktioniert! Aus Neugier, warum entfernen iTunesMetadata.plist?

Eine ePub-Datei ist im Grunde nur ein gezippter Ordner, obwohl sie eine Mimetype-Datei enthält, die anscheinend nicht komprimiert werden muss.

Dies würde bedeuten, dass es nicht ganz einfach ist, mit einer einfachen Zip-App neu zu erstellen. Es kann jedoch einfacher sein.
Nehmen wir an, nichts hat es tatsächlich ausgepackt, sondern nur verwirrt darüber, wie man damit umgeht. Arbeite an einer Kopie.

Zwei Dinge zum Ausprobieren...

  1. Versuchen Sie es einfach umzubenennen, ändern Sie .epub in .zip und ändern Sie es dann wieder zurück, um zu sehen, ob es richtig erkannt wird.

  2. Öffnen Sie es in Calibre
    Sie haben dann unzählige Möglichkeiten, damit umzugehen, am einfachsten ist es, zu sehen, ob es über OPDS mit Ihrem E-Book-Reader kommunizieren kann. Calibre kann seinen eigenen lokalen Server auf Ihrem WLAN betreiben und Sie können Bücher sehr einfach kopieren.
    Wenn Sie immer noch keine Freude haben, lassen Sie Calibre sie [erneut] in ein ePub konvertieren. Dies ist eine großartige Methode, um eine Datei zu reparieren, da sie sie erneut untersuchen, Schriftarten, schlechte Silbentrennungen und alle möglichen Probleme beheben kann.

Calibre selbst ist ein zu großes Thema, um es wirklich in einer einfachen QA zu behandeln, aber es gibt Unmengen von Daten darüber auf der Website selbst und unter http://www.mobileread.com/forums/ , einschließlich Abschnitten für die meisten großen E-Reader .

Sehr interessant, danke. Ich bin froh, dass Sie meinen Verdacht bezüglich der Kompression bestätigt haben. Kennen Sie eine Methode, um dies über die Shell von oben zu tun? Ich gehe davon aus, dass dies mit einer einfachen Beschwörung ziemlich schnell und einfach geht, wenn ich herumfummeln und entweder eine finden oder mir eine einfallen lassen kann.
Ich habe das gefunden - mobileread.com/forums/showthread.php?t=29057 - obwohl ich kein Experte bin, wenn es um Terminal geht.
Ich weiß, dass es 5 Jahre her ist, aber das Umbenennen von .epub.zip in .epub hat es für mich behoben.

Reproduktion des Problems:

  1. Eine ePub-Datei mit dem Namen book.epubist beispielsweise eine Datei ( -rw-r--r--).
  2. Mit der iBooks-App öffnen book.epub.
  3. Entnehmen Sie die in gespeicherte zwischengespeicherte Datei ~/Library/Containers/com.apple.BKAgentService/Data/Documents/iBooks/Books/, die in einen anderen Namen wie z. B. umbenannt wurde, A22DFAF7E75C21D979C375B1AD07008F.epubund wird zu einem Verzeichnis ( drwxr-xr-x@).

Schritte der Problemumgehung, die auf meinem Mac funktioniert:

  1. Ändern Sie die Erweiterung von A22DFAF7E75C21D979C375B1AD07008F.epubvon .epubin .zip.
  2. Gehen Sie in das Zip-Paket und packen Sie den gesamten Inhalt in eine neue .zipDatei, sagen wir Archive.zip.
  3. Ziehen Sie die neue Datei heraus .zipund ändern Sie die Erweiterung wieder in .epub.
  4. Die Archive.epubDatei ist eine Datei ( -rw-r--r--).

Ich habe einige der Kommentare hier genommen und ein Jupyter-Notizbuch bereitgestellt , das dies für eine Sicherung von beispielsweise einem Bücherverzeichnis tut:

import pathlib
import glob
import os
import zipfile

# Extract the relevant components of a full path
def pathComponents(fullpath):
    path = pathlib.Path(fullpath)
    name = path.name
    stem = path.stem
    suffix = path.suffix
    parent = path.parent
    return name, stem, suffix, parent

# Get directories in your path that have a .epub suffix
def getePubDirs(path):
    epubSearch = os.path.join(path, "*" + "." + "epub")
    eDirs=[]
    for p in glob.glob(epubSearch):
        if (os.path.isdir(p)):    # Only if it's an epub directory
            eDirs.append(p)
    return eDirs

def createZipFile(fname, files):
    zFile = zipfile.ZipFile(fname, mode='w', compression=zipfile.ZIP_DEFLATED)
    for f in files:
        zFile.write(f)
    zFile.close()

def convertDirToePub(dirname):
    name, stem, suffix, parent = pathComponents(dirname)        # get dirname details
    newdirname = zFile = str(parent) + "/" + name + ".ori"
    zFile = str(parent) + "/" + stem + ".epub"
    os.rename(dirname,newdirname)     # rename the epub dir so the epub can take its old name
    # get all the files within the epub directory
    os.chdir(newdirname) # We need to be in directory so the resultant epub paths are correct
    everything = [os.path.join(r,file) for r,d,f in os.walk(".") for file in f]
    createZipFile(zFile, everything)  # Create a zip file containing all those files
    os.chdir(parent)

dirtoconvert='/Users/<username>/tmp/Booksdir'

eDirs = getePubDirs(dirtoconvert)
totalDirs=len(eDirs)
print(totalDirs, "docs to convert")
ctr=1
for i in eDirs:
    print(ctr, "of", totalDirs, ": Converting ", i)
    convertDirToePub(i)
    ctr = ctr + 1
print("Done!")

Ich habe die hier freigegebenen Methoden angepasst und das folgende Shell-Skript erstellt.

Es ist ziemlich einfach, da es keine Argumente benötigt, es läuft einfach von dem Verzeichnis aus, in dem es ausgeführt wird.
Das Skript fügt ein fixedVerzeichnis hinzu, falls noch keines vorhanden ist, in dem es die korrigierten Dateien ablegt.

Sie können es entweder zu einer Datei hinzufügen, dh fix_epub.sh. .bashrcOder fügen Sie es Ihrer /etc.-Datei hinzu .zshrc, indem Sie es in eine Funktion einschließen. Ich habe Beispiele für jeden unten hinzugefügt.

Dann von Ihrem Terminal cd <epub-path>zu Ihrem .epub-Ordner und entweder;

  1. Verwenden der Shell-Datei
    a. ausführen touch fix_epub.shund Ihren Code zur Datei hinzufügen.
    B. laufen sh fix_epub.sh.
  2. Verwenden einer Shell-Funktion
    a. ausführen fix_epub(vorausgesetzt, Sie haben es bereits zu hinzugefügt .bashrc).

Skripte

fix_epub.sh

#!/bin/bash

mkdir -p fixed

find . -name "*.epub" | while read -r file; do
  (cd "$file" || exit && \
  find . -iname 'iTunesMetadata*.plist' -delete && \
  zip -r -X "../fixed/$file" mimetype .)
done

.bashrc

function fix_epub () {
  mkdir -p fixed

  find . -name "*.epub" | while read -r file; do
    (cd "$file" || exit && \
    find . -iname 'iTunesMetadata*.plist' -delete && \
    zip -r -X "../fixed/$file" mimetype .)
  done
}