andichrist
Goto Top

Lösung gesucht: aus epub METADATA title leeren. eBookReader soll dadurch nach Dateinamen sortieren bzw. diese anzeigen

Hallo alle zusammen,

ich suche eine "Lösung" um alle in einem Ordner befindliche "epubs" in einem Rutsch die <metadata> "title" zu leeren.

Hintergrund:
Meine Frau und ich lesen viel auf eBook-Readern. Bevorzugtes Format ist "epub". Diese XML basierende Datei können wie MP3s getagt sein, wie title, creator, date.... Leider werden diese Metadaten bei eBookReadern zum Anzeigen und Sortieren als erstes verwendet - der Dateiname wird hierbei (leider) komplett ignoriert! Diese Metadaten müssen gepflegt sein, damit die epubs auch sauber auf dem eBookReader angezeigt werden, das ist im Einzelfall mit calibre, EPubMetadataEditor oder tweak_epub möglich. Bei mehreren epubs aber sehr zeitraubend.

Trick:
Jetzt gibt es einen Trick um diese Geschichte mit der Pflege der Metadaten zu umgehen. Wenn im <metadata> "title" nichts steht also leer ist <dc:title></dc:title>, genau dann zeigt der eBookReader die Dateiname an und sortiert entsprechend den Dateinamen.

Die METADATA "Title" befindet sich immer in der content.opf.

epub Aufbau:
Wenn man die Dateiendung "epub" in "zip" umbenennt, kann man sie öffnen:

Das sieht z.B. so aus:
 
21.04.2016  22:51         <DIR>    META-INF
21.04.2016  22:51         <DIR>    text
21.04.2016  21:54           4.756  content.opf
21.04.2016  21:54          74.610  cover.jpeg
21.04.2016  21:54              20  mimetype
21.04.2016  21:54              58  page_styles.css
21.04.2016  21:54           2.636  stylesheet.css
21.04.2016  21:54             799  titlepage.xhtml
21.04.2016  21:54           4.104  toc.ncx

Oder z.B. so:

 
21.04.2016  23:27         <DIR>    META-INF
21.04.2016  23:27         <DIR>    Ops           //  <- content.opf  ist hier drin 
11.12.2015  01:49              20  mimetype

Oder z.B.auch so:

 
22.04.2016  14:05         <DIR>    META-INF
22.04.2016  14:05         <DIR>    OEBPS         //  <- content.opf  ist hier drin
24.07.2015  11:49              20  mimetype

Die METADATA "Title" befindet sich immer in der content.opf

Der Datei-Ausschnitt sieht so z.B. aus:

 
. 
. 
. 
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">   
<dc:title>H. P. Lovecraft - der Poet des  Grauens</dc:title> 
<dc:creator opf:file-as="Alpers, Hans Joachim" opf:role="aut">Hans Joachim Alpers </dc:creator>   
<dc:publisher>CORIAN-Verlag</dc:publisher> 
<dc:date>2015-12-11</dc:date> 
<dc:identifier id="BookId">AWP-6C36EAE6-03A1-4247-9D0E-35EC317BDA1C</dc:identifier>   
<dc:language>de</dc:language> 
<meta name="cover" content="cover"/>   
</metadata> 
. 
. 
.


Jetzt muß in diesem Beispiel die 2. Zeile ausgetauscht werden!

 
<dc:title>H. P. Lovecraft - der Poet des  Grauens</dc:title>

durch

 
<dc:title></dc:title>


Es wäre schön, wenn mir jemand eine funktionierende Lösung Batch/ PowerShell anbieten könnte, damit man das Leeren des Feld "Title" bei jeder "epub", die sich alle im gleichen Ordner befinden, automatisieren kann.

Danke im Voraus

Viele Grüße
Andy

Content-ID: 302669

Url: https://administrator.de/contentid/302669

Ausgedruckt am: 24.11.2024 um 23:11 Uhr

beidermachtvongreyscull
Lösung beidermachtvongreyscull 23.04.2016 um 17:30:49 Uhr
Goto Top
Hast Du schon nach "epub metadata editor" gegoogelt? Es wird ein Programm erwähnt, das Batchoperationen (also an mehreren Dateien) unterstützt.
Andichrist
Andichrist 23.04.2016 um 18:26:58 Uhr
Goto Top
Hallo,

danke für den Kommentar und ja zu deiner Frage. Denn "EPubMetadataEditor " habe ich bereits neben caibre und tweak_epub ausprobiert - siehe auch meine Ausführung oben. Die Möglichkeit per Batch-Job für das Feld "Titel" funktioniert nicht.
rubberman
Lösung rubberman 24.04.2016, aktualisiert am 25.04.2016 um 22:56:57 Uhr
Goto Top
Hallo Andy.

Die METADATA "Title" befindet sich immer in der content.opf
Nee, in der .opf Datei, deren Pfad sich in der META-INF\container.xml finden lässt. Der Name kann und wird ggf. abweichen. Ist aber nicht weiter schlimm, da es nur jeweils eine Datei mit Endung .opf geben sollte ...

Jetzt muß in diesem Beispiel die 2. Zeile ausgetauscht werden!
XML bearbeitet man gemäß dem Document Object Model. Sich auf irgendeine Zeilensortierung zu verlassen, geht in die Hose.

Um zum Ziel zu kommen, brauchst du ein Tool, dass mit ZIP umgehen kann. Ich nutze im folgenden 7-Zip, das du ggf. installieren müsstest.

Speichere folgendes Script mit der Endung .bat
@if (@x)==(@y) @end /*

@echo off &setlocal
set "p7z=%ProgramFiles%\7-Zip\7z.exe" 
set "epubdir=D:\eBooks" 

set "flag=" 
for /f "delims=" %%h in ('dir /a-d /b /s "%epubdir%\*.epub"') do ( 
  for /f "tokens=3,5*" %%i in ('call "%p7z%" l "%%~h"^|findstr /ie "\.opf"') do if "%%i" lss "D" ( 
    >nul call "%p7z%" x "%%~h" "%%k" 
    cscript //nologo //e:jscript "%~fs0" "%%k" 
    >nul call "%p7z%" u "%%~h" "%%k" 
    if "%%k"=="%%~nxk" (del "%%k") else ( 
      set "p=%%k" 
      setlocal EnableDelayedExpansion
      for %%l in ("!p:\=" "!") do if not defined flag (set "flag=1" &rd /s /q %%l) 
      endlocal
    )
  )
)
pause
exit /b

*/

var oXmlDoc = new ActiveXObject('Microsoft.XMLDOM');  
oXmlDoc.async = false;
oXmlDoc.load(WScript.Arguments(0));
var oErr = oXmlDoc.parseError;
if (oErr.errorCode == 0) {
  var oNode = oXmlDoc.documentElement.selectSingleNode('//metadata/dc:title');  
  if (null != oNode) {
    oNode.text = '';  
    oXmlDoc.save(WScript.Arguments(0));
  }
}
Den Pfad zur 7z.exe und den Pfad zu deinen ePUB Dateien (Zeilen 4, 5) musst du entsprechend anpassen.
Versteht sich, dass du vorher ein Backup der Dateien machen solltest. Ich habe bislang lediglich mit einer Datei getestet ...

Grüße
rubberman

/EDIT: Link zur letzten Version des Scripts
colinardo
Lösung colinardo 24.04.2016 aktualisiert um 14:39:19 Uhr
Goto Top
Hallo Andy,
und wenn du es mit Powershell ohne Zusatztools machen willst kannst du das hier nehmen:
(min. PS 3.0, Kommentare sind für jede Codezeile vorhanden)
<#
    Löscht den Title aus der content.opf jeder epub Datei eines Ordners (inkl. Unterordner)
#>
# ===== Variablen anpassen =======
# Pfad zu den Dateien
$pathFiles = 'A:\ebooks'  
# ================================

# Benötigt wird mindestens NET-Framework 4.5 und Powershell 3.0
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}   

# benötigte Assemblies laden
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.Filesystem

# Verarbeite alle eBooks im Ordner
gci $pathFiles -Filter '*.epub' -Recurse -File | %{  
    # ePub als ZIP-Datei im Update-Modus öffnen
    $zipfile = [System.IO.Compression.ZipFile]::Open($_.FullName,[System.IO.Compression.ZipArchiveMode]::Update)
    
    # Temporäre Extrahierungs-Pfade für die Datei die geändert wird
    $contentfile = "$env:TEMP\content.opf"  
    
    # Falls die temoporäre Datei existiert lösche sie
    if((Test-Path $contentfile)){del $contentfile -Force}
    
    # Einträge der benötigte Dateien aus dem Dokument holen
    $entry = $zipfile.Entries | ?{$_.Name -eq 'content.opf'} | select -First 1  
    
    if ($entry){
        # content.opf extrahieren
        [System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry,$contentfile)

        # Titel leeren (wegen einer Property, hier per einfachem Regex-Replace)
        (gc $contentfile) -replace '(<dc:title[^>]*>).*?(</dc:title>)','$1$2' | set-content $contentfile  

        # Alternative Variante zum Löschen des Titels via XML (nicht aktiv)
        <#
            $xml = [xml](gc $contentfile)
            $xml.package.metadata.title.InnerText = ''  
            $xml.Save($contentfile)
        #>

        # alte content.opf aus der epub-Datei entfernen
        $entry.Delete()

        # geänderte Dateien wieder hinzufügen
        [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zipfile,$contentfile,$entry.Fullname) | out-null

        write-host "$($_.FullName) ==> Update durchgeführt." -ForegroundColor Green  
    }else{
        write-host "$($_.FullName) ==> Datei enthält keine 'content.opf'." -ForegroundColor Yellow  
    }
    # Zipfile-Resourcen freigeben
    $zipfile.Dispose()
}
Grüße Uwe
Andichrist
Andichrist 24.04.2016 aktualisiert um 14:40:27 Uhr
Goto Top
Hallo @rubberman,

danke für deine Korrekturen meiner Ausführungen (1. Posting). Wieder etwas dazu gelernt. face-smile

Und deine Batch-Lösung funktioniert (so wie ich es wollte) tadellos! DANKE!!!

Noch ein Wunsch von meiner Frau. face-wink
Könntest du dein Script noch so anpassen/ erweitern, dass es auch inklusive Unterordner funktioniert! Das wäre eine klasse Sache.

Ich danke dir.

Andy
Andichrist
Andichrist 24.04.2016 aktualisiert um 14:51:46 Uhr
Goto Top
Hallo @colinardo,


danke für deinen Lösungsvorschlag - tolle Kommentierung der Script-Zeilen. Um sie aber zu testen (ich würde sie wirklich liebend gerne testen) brauche ich von dir an der Basis noch weitere Unterstützung. face-wink

Auf meinem Notebook habe ich Windows 7 Ultimate (64 Bit) mit Powershell 1.0 und .NET Framework 4.6.1

Meine Versuche eine neuere Powershell-Version (also 3, 4 oder 5) runter zu landen - schlugen fehl. Ich werde für den DOWNLOAD immer auf eine Microsoft Seite verwiesen mit Windows 10!

Weißt du Rat?

Danke im Voraus
Andy

--- EDIT----
Mein Fehler! Ich konnte es doch runter laden! Auf der MS Seite mit WINDOWS 10, muss man nur weiter runter scrollen um den DOWNLOAD zu sehen. Ich melde mich wieder nach dem Test ...
colinardo
Lösung colinardo 24.04.2016 aktualisiert um 14:59:41 Uhr
Goto Top
Hi Andy,
kein Problem, hier bekommst du das richtige Package für Windows 7
Windows Management Framework 4.0
oder das aktuellste:
Windows Management Framework 5.0
(Hinweis: PS 5.0 sollte zum Zeitpunkt dieses Posts nicht auf Systemen installiert werden die eines der folgenden Produkte verwenden: Exchange Server 2013, Exchange Server 2010 SP3, SharePoint Server 2013, SharePoint Server 2010, System Center 2012 Virtual Machine Manager)

Als Suchbegriff ist hier immer "Windows Management Framework" der richtige Begriff.

Grüße Uwe
Andichrist
Andichrist 24.04.2016 um 14:54:51 Uhr
Goto Top
Hallo Uwe,

danke für die rasche Antwort!

Hättest du auch einen Download-Link für Windows 10 Home (64 Bit), das ist für das Notebook meiner Frau.

Danke im Voraus
Andy
colinardo
Lösung colinardo 24.04.2016 aktualisiert um 14:58:48 Uhr
Goto Top
Windows 10 hat per Default schon die aktuellste Powershell 5.0 intergiert, hier ist kein Update mehr nötig.
Das Skript oben verwendet die integrierten .NET-ZIP-Funktionen die ab PS 3.0 enthalten sind. Also dort kein Problem.
rubberman
Lösung rubberman 24.04.2016 aktualisiert um 21:14:03 Uhr
Goto Top
Hallo Andy.

inklusive Unterordner
Nanu? Macht doch das DIR /S bereits. Einfach mal testen.

Grüße
rubberman

//EDIT Hab's selbst getestet, funktioniert.
Füge zw. Zeile 8 und 9 noch ein
  echo "%%~h"
ein, dann siehst du welche Dateien gefunden und verarbeitet werden.
Andichrist
Andichrist 24.04.2016 um 21:43:34 Uhr
Goto Top
Hallo @rubberman,

sehr schön, dass deine Batch-Lösung von Haus aus auch Unterverzeichnisse unterstützt!
Deine Batch funktioniert auch mit verschachtelten Unterverzeichnisse wunderbar! TOP.

Es gibt nur noch eine Kleinigkeit, bei der sich die Batch aufhängt.
Und zwar, wenn im Feld Title ein ":" (Doppelpunkt) steht, dann hängt sich die Batch auf! Siehe Bild Fehlermeldung!

z.B wenn im Title-Feld so etwas steht.
<dc:title>Der Teufel von Echo Lake: Thriller (German Edition)</dc:title>

Wunsch:

Könntest du deine Batch diesbezüglich noch anpassen, damit sie mit dem Doppelpunkt im Title Feld auch zurecht kommt.

Vorab schon ein mal danke für deine bisherige gute Arbeit. Danke!

Viele Grüße
Andy
fehlermeldung
rubberman
Lösung rubberman 24.04.2016, aktualisiert am 29.04.2016 um 11:15:02 Uhr
Goto Top
Hallo Andy,

habe gerade eine Testdatei mit eben dem von dir zitierten Titel ausgestattet. Läuft ohne Probleme. Könnte es sein dass du die Datei gerade geöffnet hattest und sie gelockt war? Gegen ein "Zugriff verweigert" kann ich sowieso nichts weiter tun, als den Fehler abzufangen und die entsprechende Datei zu ignorieren. Bearbeiten kann man sie im gelockten Zustand nicht.
@if (@x)==(@y) @end /* Gültige Zeile in Batch und JScript, die einen JScript Kommentar einleitet.

:: Batch Part
@echo off &setlocal
REM Pfad zur 7z.exe
set "p7z=%ProgramFiles%\7-Zip\7z.exe"  
REM Pfad zu den ePUB Dateien
set "epubdir=D:\eBooks"  

REM 7z Pfad zu 8.3 Kurznamen konvertieren
for %%i in ("%p7z%") do set "p7z=%%~fsi"  
REM Rekursiv nach allen .epub Archiven suchen.
for /r "%epubdir%" %%h in ("*.epub") do (  
  REM Fehlerflag. Initial wird angenommen, dass ein Fehler auftritt und die Variable ist definiert.
  set "fail=1"  
  REM Eingenschaften "Schreibgeschützt", "System" und "Versteckt" beim gefundenen Archiv entfernen.  
  attrib -r -s -h "%%~h"  
  REM Inhalt des Archivs auflisten und nur die Zeile mit der .opf Datei aus der Liste extrahieren.
  for /f "delims=" %%i in ('%p7z% l "%%~h" -y^|findstr /ie "\.opf"') do (  
    REM Gefundene Zeile einer Variablen zuweisen.
    set "ln=%%i"  
    REM Verzögerte Variablenerweiterung einschalten, um die neue Variable in einem Zeilenblock verarbeiten zu können.
    setlocal EnableDelayedExpansion
    REM Die ersten 20 Zeichen der Variable werden abgeschnitten. Dort findet sich das Timestamp der Datei, falls dieses gestzt war.
    REM Das erste Token enthält die Dateiattribute, alles nach dem dritten Token ist Pfad und Name der .opf Datei im Archiv.
    REM Nach dem Splitten der Zeile wird die Verzögerte Variablenerweiterung ausgeschaltet und geprüft, dass der gefundene Pfad kein Verzeichnis ist.
    for /f "tokens=1,3*" %%j in ("!ln:~20!") do endlocal &if "%%j" lss "D" (  
      REM Temporäres Verzeichnis für zu entpackende Dateien anlegen.
      md "unzip"  
      REM Die .opf Datei unter Beibehaltung ihres Pfads entpacken.
      >nul 2>&1 %p7z% x "%%~h" "%%l" -o"unzip" -y  
      REM Falls das erfolgreich war und die ausgepackte Datei existiert...
      if exist "unzip\%%l" (  
        REM In das temporäre Verzeichnis wechseln.
        pushd "unzip"  
        REM Eingenschaften "Schreibgeschützt", "System" und "Versteckt" der .opf Datei entfernen.  
        attrib -r -s -h "%%l"  
        REM Diese Scriptdatei als JScript ausführen, wobei der Pfad der .opf Datei übergeben wird um dort den Titel entfernen zu können.
        cscript //nologo //e:jscript "%~fs0" "%%l"  
        REM Wenn das Entfernen erfolgreich war ...
        if not errorlevel 1 (
          REM Update der .opf Datei im Archiv.
          >nul 2>&1 %p7z% u "%%~h" "%%l" -up1q1r2x2y2z2w2 -y  
          REM Falls das erfolgreich war, Fehlerflag entfernen, ansonsten ...
          if not errorlevel 2 (set "fail=") else (  
            REM Alle anderen Dateien und Verzeichnisse aus dem Archiv zur bereits geänderten .opf Datei entpacken.
            >nul 2>&1 %p7z% x "%%~h" -xr!"*.opf" -y  
            REM Falls das erfolgreich war ...
            if not errorlevel 2 (
              REM Originalarchiv löschen.
              del /f "%%~h"  
              REM Archiv aus den entpackten Dateien neu erstellen.
              >nul 2>&1 %p7z% a "%%~h" -r -tzip -y  
              REM Falls das erfolgreich war, Fehlerflag entfernen.
              if not errorlevel 2 set "fail="  
            )
          )
        )
        REM In das ursprüngliche Arbeitsverzeichnis zurückwechseln.
        popd
      )
      REM Temporäres Verzeichnis löschen.
      rd /s /q "unzip"  
    )
  )
  REM Anhand des Fehlerflags Fehler- oder Erfolgsmeldung ausgeben.
  if defined fail (>&2 echo *** Fehler: "%%~h") else echo OK: "%%~h"  
)

pause
REM Batchverarbeitung beenden.
exit /b

Hier endet der JScript Kommentar: */

/* JScript Part */

// Try Block, um Ausnahmefehler der JScript Verarbeitung abzufangen.
try {
  // Instanz des Microsoft.XMLDOM Objektes erstellen
  var oXmlDoc = new ActiveXObject('Microsoft.XMLDOM');  
  // Flag um zu signalisieren, dass auf eine vollständig geldene XML Datei gewartet werden soll.
  oXmlDoc.async = false;
  // Die übergebene .opf Datei als XML Text laden.
  oXmlDoc.load(WScript.Arguments(0));
  // Fehlerobjekt deklarieren.
  var oErr = oXmlDoc.parseError;
  // Falls beim Parsen des Dateiinhalts kein Fehler aufgetreten ist ...
  if (oErr.errorCode == 0) {
    // Knotenobjekt deklarieren und initialisieren, das den Titel enthält.
    var oNode = oXmlDoc.documentElement.selectSingleNode('//metadata/dc:title');  
    // Falls der Knoten gefunden wurde ...
    if (null != oNode) {
      // Text des Knotens löschen.
      oNode.text = '';  
      // XML Text in die .opf Datei zurückschreiben.
      oXmlDoc.save(WScript.Arguments(0));
      // Script beenden und 0 zurückgeben.
      WScript.Quit(0);
    }
  }
  // Diese Punkt wird erreicht, wenn eines der if Statements FALSCH ergeben hat. Script beenden und 1 als Fehlerindikator zurückgeben.
  WScript.Quit(1);
}
// Der catch Block wird ausgeführt, wenn ein Ausnahmefehler aufgetreten ist.
catch(e) {
  // Script beenden und 1 als Fehlerindikator zurückgeben.
  WScript.Quit(1);
}
Nur aus Interesse: Was ist denn in deinem Script die Zeile 46, auf die sich die Fehlermeldung bezieht?

Grüße
rubberman

/EDIT Mir ist gerade noch eingefallen, dass die Datei(en) das Attribut "schreibgeschützt" haben könnten. Hab das mal im Script berücksichtigt...

/EDIT2 Zeile 13: FOR /F durch FOR /R Schleife ersetzt.

/EDIT3 Bugfix für Dateiinhalte ohne Timestamps.

/EDIT4 Errorhandling geändert.

/EDIT5 ePUB Dateien, bei denen das Update fehlschlägt, aus dem extrahierten Inhalt neu erstellen.

/EDIT6 Kommentare hinzugefügt

/EDIT7 Support für Dateinamen mit Prozentzeichen hergestellt
Andichrist
Andichrist 25.04.2016 aktualisiert um 00:28:55 Uhr
Goto Top
Nur aus Interesse: Was ist denn in deinem Script die Zeile 46, auf die sich die Fehlermeldung bezieht?

Fehler ist nicht mehr reproduzierbar.

Es wäre aber die letzte Zeile deines Scripts:

oXmlDoc.save(WScript.Arguments(0));

//EDIT Mir ist gerade noch eingefallen, dass die Datei(en) das Attribut "schreibgeschützt" haben könnte. Hab das mal im Script berücksichtigt...

Okay danke. Dein Script funktioniert jetzt gemäß meinen Wünschen, allerdings verschluckt es sich bei einigen Dateinamen mit Umlauten. ABER nicht bei allen - echt seltsam!

Ich dachte ein ä ist auch ä oder ö ein ö. Das scheint aber nicht so zu sein - leider. Siehe auch (Bild 1)

Lumley Brian - Necroscope 06 - Dämonenhass.epub
Lumley Brian - Necroscope 07 - Totenbeschwörung.epub

Das wiederum funktioniert:

Lumley Brian - Necroscope 08 - Blutfürsten.epub

Ahh ich sehe gerade, wenn du oben bei den Dateinamen genau hin guckst bei Buch 06 und 07 sind die Punkte verschoben, das ist tatsächlich kein ä oder ö sondern irgendwelche Sonderzeichen/ Symbole! Wenn ich das ä und ö händisch abändere - läuft deine Routine korrekt!!! Siehe (Bild2)

Hast du da noch einen Tipp für mich an was das liegt bzw. wie ich das beheben kann. Ich habe keine Ahnung was für Symbole das sind oder wie die da hin kommen. Im TotalCommander sieht alles normal aus, ist also nicht als Symbole zu erkennen.


Danke für deine tolle Arbeit. Vielleicht hast du noch einen Tipp/ Lösung mit den Dateinamen.

Viele Grüße
Andy
batch-job1
batch-job2
rubberman
Lösung rubberman 25.04.2016 um 00:44:10 Uhr
Goto Top
Hallo Andy,

was zum Lesen:
Kombinierendes Zeichen
Kombinierende diakritische Zeichen
Ob ich das lösen kann, weiß ich noch nicht. Muss testen...

Grüße
rubberman
Andichrist
Andichrist 25.04.2016 um 01:12:17 Uhr
Goto Top
Hi danke,

deine Links muss ich mir ansehen!

Kannst du in deinem Script bitte noch folgenden Sonderfälle berücksichtigen! Der Bindestrich "-" und noch ein verlängerter Bindestrich "–" sowie Ausrufezeichen "!".

Bei diesen Sonderfällen hängt sich deine Routine auf! Siehe Bild

Beispiel Inhalt Feld title:
Passage Trilogie 1 - Der Übergang
Anonyme Untote – Eine Zombie-Liebesgeschichte
T93 Band 1: Überlebe!

Das wäre dann wirklich die FINALE Version!

Ich danke dir!

Viele Grüße
Andy
sonderzeichen
rubberman
Lösung rubberman 25.04.2016 aktualisiert um 01:41:43 Uhr
Goto Top
Hallo Andy.

Das DIR Command scheint ein paar Bugs zu haben.
Tausche Zeile 8 (bezieht sich auf mein letztes Script).
for /r "%epubdir%" %%h in ("*.epub") do (

Alles was so nicht funktioniert, werde ich nicht lösen können, fürchte ich.

Ausrufezeichen dürften aber nie ein Problem gewesen sein, es sei denn du rennst dein gesamtes Script mit eingeschalteter verzögerter Variablenerweiterung (setlocal EnableDelayedExpansion) was fatal wäre.

Grüße
rubberman
Andichrist
Andichrist 25.04.2016 aktualisiert um 12:05:06 Uhr
Goto Top
Moin @rubberman,


du hast mich leider Missverstanden! Mein Fehler, das hätte ich besser formulieren müssen!

Sorry für den Umstand! face-wink

Bei dem oben angesprochen Problem hier....

Beispiel Inhalt Feld title.
Passage Trilogie 1 - Der Übergang
Anonyme Untote – Eine Zombie-Liebesgeschichte
T93 Band 1: Überlebe!

... handelt es sich nicht um Dateinamen, sondern um das <Title> Feld also die Titel-Beschreibung je epub aus der content.opf!

Ich hätte es besser so schreiben sollen! face-wink

epub-Dateiname + deren <Title>-Beschreibung. Auszug je content.opf:

Datei: Cronin, Justin - Passage-Trilogie 1 - Der Übergang (2010).epub
<Title>-Beschreibung
<dc:title>Passage Trilogie 1 - Der Übergang</dc:title>       //<- hier Abbruch wegen  Bindestrich "-"  

Datei: Browne, S. G. - Anonyme Untote - Eine Zombie-Liebesgeschichte (2009).epub
<Title>-Beschreibung
<dc:title>Anonyme Untote – Eine Zombie-Liebesgeschichte</dc:title>      //<- hier Abbruch wegen  verlängertem Bindestrich "–" 

Datei: Husker, Clayton - T93 1 - Überlebe! (2014).epub
<Title>-Beschreibung
<dc:title>T93 Band 1: Überlebe!</dc:title>     //<- hier Abbruch wegen Ausrufezeichen "!"  // ":" Doppelpunkt wurde von dir schon berücksichtigt 

Also nochmals meine Bitte:
Kannst du in deinem Script bitte noch folgenden Sonderfälle berücksichtigen! Der Bindestrich "-" und noch ein verlängerter Bindestrich "–" sowie Ausrufezeichen "!" für das Feld <dc:title></dc:title> in der content.opf !

In Analogie zu dem ":" Doppelpunkt.

Das wäre toll, wenn du das doch "einbauen" kannst. face-wink

Danke im Voraus schon einmal,
Andy
rubberman
Lösung rubberman 25.04.2016 aktualisiert um 12:20:31 Uhr
Goto Top
Hallo Andy.

Kannst du in deinem Script bitte noch folgenden Sonderfälle berücksichtigen! Der Bindestrich "-" und noch ein verlängerter Bindestrich "–" sowie Ausrufezeichen "!" für das Feld <dc:title></dc:title> in der content.opf !

Alles längst getestet. Der Inhalt in der .opf ist kein Problem. Der wird überhaupt nicht vom Script betrachtet und nur stumpf durch einen "leeren" String ersetzt. Daran liegt es also schon mal nicht.
Aber, wie sich aus deinen Fehlermeldungen erkennen lässt, wurden Dateinamen (.epub) mit solchen Zeichen nicht vernünftig verarbeitet. Die Änderung von FOR /F zu FOR /R, wie oben geschrieben, sollte das Problem beseitigen.

Also noch mal: Der Inhalt der .opf war bislang nie Grund für Fehler, auch wenn es für dich vielleicht den Anschein hatte.

Grüße
rubberman
Andichrist
Andichrist 25.04.2016 um 14:25:52 Uhr
Goto Top
Hallo @rubberman,


danke für deine Ausführungen. Ich konnte die Fehlerquelle jetzt finden! Es lag an den drei eBooks selbst. Dein Script funktioniert!

Fehlerquelle gefunden!
Wenn tatsächlich der <Title>Inhalt simpel durch einen "leeren" String ersetzt wird, verstand ich allerdings folgendes Ergebnis nicht.

Damit man den Dateinamen ausschließen kann, habe ich die drei eBooks umbenannt.

Cronin, Justin - Passage-Trilogie 1 - Der Übergang (2010).epub ==> aaa.epub
Browne, S. G. - Anonyme Untote - Eine Zombie-Liebesgeschichte (2009).epub ==>bbb.epub
Husker, Clayton - T93 1 - Überlebe! (2014).epub ==>ccc.epub

Und die <Title>Beschreibung beibehalten!

==> aaa.epub mit <title>Inhalt ==> Passage Trilogie 1 - Der Übergang (Bild1)
==> bbb.epub mit <title>Inhalt ==> Anonyme Untote – Eine Zombie-Liebesgeschichte (Bild2)
==> ccc.epub mit <title>Inhalt ==> T93 Band 1: Überlebe! (Bild1)

Fehlermeldung über Fehlermeldung ... face-sad

Jetzt habe ich eine andere epub genommen, die ohne Probleme mit deinem Script funktioniert und habe die drei Beispielinhalte jeweils hinzugefügt!

Passage Trilogie 1 - Der Übergang
Anonyme Untote – Eine Zombie-Liebesgeschichte
T93 Band 1: Überlebe!

Sie da, es funktioniert! Wie schon gesagt der Fehler lag direkt bei den Dateien.


Super danke! Problem gelöst.

Viele Grüße
Andy


PS: Noch ein Tipp, wenn jemand einen eBookReader kaufen möchte, der auch von Haus aus auch Ordnerstrukturen kann, dann kommen nur Geräte von PocketBook in Frage! In meinem Fall PocketBook touch Lux 3. Mit der Batch zeigt er jetzt auch die Dateinamen an - PERFEKT!
fehlermeldung ccc.epub
fehlermeldung aaa.epub
fehlermeldung bbb.epub
rubberman
Lösung rubberman 25.04.2016 um 15:58:32 Uhr
Goto Top
Hallo Andy,

das sind aber merkwürdige Fehler. Hmm, ohne die Originaldateien kann ich da nicht viel sagen. Klar kann es bei Dateien aus dem Internet sein, dass sie auf einem anderen Betriebssystem erstellt wurden (bspw. Linux), wo Dinge valide sind, die unter Windows ein No Go sind. Dafür gibt es einige Beispiele...
Wie auch immer, freut mich wenn es deinen Anforderungen genügt face-smile Ich ändere mein letztes Script dann noch mit der FOR /R Schleife für die Nachwelt ...

Grüße
rubberman
rubberman
Lösung rubberman 25.04.2016 aktualisiert um 22:51:16 Uhr
Goto Top
OK, nachdem ich die 3 Originaldateien bekommen habe, hat sich herausgestellt dass der Inhalt der ersten beiden keine Timestamps enthält und das Parsen der Listenausgabe von 7-Zip dadurch fehlschlägt. Das Bugfix habe ich oben im Script eingefügt.

Die dritte Datei scheint tatsächlich defekt zu sein. Ein Hinzufügen, Ändern oder Löschen von Dateien aus dem ePUB Archiv ist mit keinerlei Mitteln zu erreichen, obwohl die Datei nicht schreibgeschützt ist und eingesehen werden kann.

Grüße
rubberman