21 votos

¿Cómo recojo todas mis notas y puntos destacados de los iBooks?

Tengo muchos resaltados y notas en iBooks que he leído, y me gustaría poder reunirlos en un formato fácil de usar y manipular (por ejemplo, para escribir trabajos y citar citas).

Por ejemplo, me gustaría que un punto culminante como este

para producir algo (por ejemplo, en CSV) como

Quod me nutrit me destruit - lo que me sostiene también me destruye, 14, Tamburlane Partes Uno y Dos, Christopher Marlowe, Anthony B. Dawson ed., Bloomsbury, https://itun.es/us/qSrZ0.l

Puedo ver cómo hacer esto (más o menos) laboriosamente, una nota a la vez, usando la función de "compartir" de iBook (o copiar y pegar, por supuesto) pero no veo ninguna manera de hacerlo a granel, para todas mis notas de un libro, o incluso todos mis libros.

¿Hay alguna forma de lograrlo, con un script de Apple o usando Automator por ejemplo? O quizás haya un archivo de texto o XML que contenga mis notas y que destaque que podría escribir un script (en Python, preferiblemente) para analizar.

1 votos

La solución, resulta, (como en muchos casos), es dejar atrás a Apple y pasarse a Kindle, que tiene un gran soporte para exportar destacados y notas.

18voto

Jeff Loughridge Puntos 682

iBooks no tiene soporte para AppleScript. El las anotaciones se almacenan en un archivo SQLite : ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/ .

Podrías tratar de analizar eso. Esta respuesta da un enlace a Digerido que lee esa base de datos y luego te permite exportar tus anotaciones a Evernote, pero no sé qué formato tendrán o si quieres meterte con Evernote.

Una (posiblemente) solución simple sería abrir el libro en iBooks para iOS. Luego podrías enviarte por correo electrónico las anotaciones en masa a ti mismo.

  1. Abre el libro
  2. Presiona el "botón de la lista" para que aparezca la tabla de contenidos
  3. Cambiar a la pestaña de Notas
  4. Presiona el botón Compartir
  5. Selecciona Editar Notas
  6. Seleccione todo
  7. Compartir por correo electrónico.

Editar:

En realidad, después de leer un comentario sobre reddit parece que hay una forma de exportarlos todos desde iBooks en OS X también:

Puedes exportar tus notas en un correo electrónico desde Notas -> Seleccionar todo -> Compartir (debes mantener pulsada la tecla ctrl mientras haces clic con el botón derecho del ratón para conservar tu selección). Las partes resaltadas se copiarán en el correo electrónico con las notas y se les dará un formato adecuado. Extrañamente, en el Mac a la aplicación no le importa si el libro está protegido contra copias, siempre copiará la parte resaltada. Sin embargo, la aplicación iOS discrimina. Si su libro está protegido contra copias, entonces sólo se compartirá el nombre del capítulo. Esa parece ser la única manera de hacerlo, desafortunadamente.

Usando el trackpad de mi portátil, tuve que mantener ctrl + shift mientras se toca en el trackpad para que aparezca el menú contextual mientras se mantiene la selección.

0 votos

Esto es muy útil. Sin embargo, todavía estoy lejos de conseguir las anotaciones en un CSV u otra forma conveniente. No puedo hacer nada con la base de datos SQL, y el correo, aunque se ve bien, no es accesible mediante programación.

1 votos

¿Soy yo, o esto ya no es posible en la nueva versión de iBooks? Ya no veo el botón de Editar Notas. En ese caso, ¿cómo puedo exportar todas mis notas?

0 votos

@incandescentman A mí me aparece en iOS 8.4.

6voto

Chris Hynes Puntos 5110
  1. Instale el programa gratuito DB Browser para SQLite .
  2. Ve a la carpeta de anotaciones de iBooks: ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/
  3. Copiar el .sqlite en algún lugar (como el escritorio) para mantener el original a salvo.
  4. Abra el archivo con DB Browser.
  5. Encuentre algunas notas en su libro de destino navegando por los datos.
  6. Filtrar por el ZANNOTATIONASSETID para mostrar sólo las notas del libro de destino.
  7. Copia y pega las anotaciones que quieras en Numbers o en la aplicación que prefieras.

1 votos

La famosa facilidad de uso de Apple

1 votos

@raxacoricofallapatorius: En serio. Menudo galimatías solo para obtener una lista de las palabras del vocabulario que he subrayado.

4voto

Gustav Xyrer Puntos 11

He escrito un script para este propósito que extrae las notas de tu Mac y saca los archivos de exportación de Evernote, listos para hacer doble clic. Quizás puedas modificar mi script si no se ajusta a tus propósitos con precisión.

En resumen, lee las bases de datos de SQLite en: ./Biblioteca/Contenedores/com.apple.iBooksX/Datos/Documentos/BKLibrary Biblioteca/Contenedores/Com.apple.iBooksX/Datos/Documentos/Anotaciones de la AEA

... y en este caso, los exporta al formato .enex de Evernote.

https://github.com/jorisw/ibooks2evernote/

    <?php
    /*
     *  iBooks notes to Evernote converter
     *  by Joris Witteman <joris@jor.is>
     *  
     *  Reads the iBooks Annotations library on your Mac and exports
     *  them, tagged with their respective book title and imported in
     *  separate notebooks.
     *
     *  Usage:
     *  
     *  Move this script to the top of your personal home directory on your Mac.
     *  This is the folder that has your name, which the Finder opens if you
     *  click on the Finder icon in the Dock.
     *
     *  To export your notes to Evernote:
     *  
     *  1. Run the following command in the Terminal:
     *
     *     php ./ibooks2evernote.php
     *    
     *  2. Open the newly created "iBooks exports for Evernote" folder from your
     *     home folder, open each file in there, Evernote will open and start 
     *     importing your notes.
     *
     */

    // Default file locations for required iBooks data 
    define('RESULT_DIRECTORY_NAME',"iBooks exports for Evernote");
    define('BOOKS_DATABASE_DIRECTORY','./Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary');
    define('NOTES_DATABASE_DIRECTORY','./Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation');

    if(file_exists(RESULT_DIRECTORY_NAME)){
        die("The destination folder for the exports already exists on your Mac.\nPlease move that one out of the way before proceeding.\n");
    }

    // Verify presence of iBooks database

    if(!file_exists(BOOKS_DATABASE_DIRECTORY)){
        die("Sorry, couldn't find an iBooks Library on your Mac. Have you put any books in there?\n");
    }else{
        if(!$path = exec('ls '.BOOKS_DATABASE_DIRECTORY."/*.sqlite")){
            die("Could not find the iBooks library database. Have you put any books in there?\n");
        }else{
            define('BOOKS_DATABASE_FILE',$path);
        }
    }

    // Verify presence of iBooks notes database

    if(!file_exists(NOTES_DATABASE_DIRECTORY)){
        die("Sorry, couldn't find any iBooks notes on your Mac. Have you actually taken any notes in iBooks?\n");
    }else{
        if(!$path = exec('ls '.NOTES_DATABASE_DIRECTORY."/*.sqlite")){
            die("Could not find the iBooks notes database. Have you actually taken any notes in iBooks?\n");
        }else{
            define('NOTES_DATABASE_FILE',$path);
        }
    }

    // Fire up a SQLite parser

    class MyDB extends SQLite3
    {
      function __construct($FileName)
      {
         $this->open($FileName);
      }
    }

    // Retrieve any books.

    $books = array();

    $booksdb = new MyDB(BOOKS_DATABASE_FILE);

    if(!$booksdb){
      echo $booksdb->lastErrorMsg();
    } 

    $res = $booksdb->query("
                SELECT
                    ZASSETID,
                    ZTITLE AS Title,
                    ZAUTHOR AS Author
                FROM ZBKLIBRARYASSET
                WHERE ZTITLE IS NOT NULL");

    while($row = $res->fetchArray(SQLITE3_ASSOC) ){
        $books[$row['ZASSETID']] = $row;
    }

    $booksdb->close();

    if(count($books)==0) die("No books found in your library. Have you added any to iBooks?\n");

    // Retrieve the notes.

    $notesdb = new MyDB(NOTES_DATABASE_FILE);

    if(!$notesdb){
      echo $notesdb->lastErrorMsg();
    } 

    $notes = array();

    $res = $notesdb->query("
                SELECT
                    ZANNOTATIONREPRESENTATIVETEXT as BroaderText,
                    ZANNOTATIONSELECTEDTEXT as SelectedText,
                    ZANNOTATIONNOTE as Note,
                    ZFUTUREPROOFING5 as Chapter,
                    ZANNOTATIONCREATIONDATE as Created,
                    ZANNOTATIONMODIFICATIONDATE as Modified,
                    ZANNOTATIONASSETID
                FROM ZAEANNOTATION
                WHERE ZANNOTATIONSELECTEDTEXT IS NOT NULL
                ORDER BY ZANNOTATIONASSETID ASC,Created ASC");

    while($row = $res->fetchArray(SQLITE3_ASSOC) ){
        $notes[$row['ZANNOTATIONASSETID']][] = $row;
    }

    $notesdb->close();

    if(count($notes)==0) die("No notes found in your library. Have you added any to iBooks?\n\nIf you did on other devices than this Mac, make sure to enable iBooks notes/bookmarks syncing on all devices.");

    // Create a new directory and cd into it

    mkdir(RESULT_DIRECTORY_NAME);
    chdir(RESULT_DIRECTORY_NAME);

    $i=0;
    $j=0;
    $b=0;

    foreach($notes as $AssetID => $booknotes){

        $Body = '<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">
        <en-export export-date="'.@strftime('%Y%m%dT%H%M%S',time()).'" application="iBooks2Evernote" version="iBooks2Evernote Mac 0.0.1">';

        $BookTitle  = $books[$AssetID]['Title'];

        $j = 0;

        foreach($booknotes as $note){

            $CappedText = null;
            $TextWithContext = null;

            // Skip empty notes
            if(strlen($note['BroaderText']?$note['BroaderText']:$note['SelectedText'])==0) continue;

            $HighlightedText = $note['SelectedText'];

            // Cap the titles to 255 characters or Evernote will blank them.

            if(strlen($HighlightedText)>255) $CappedText = substr($note['SelectedText'],0,254)."…";

            // If iBooks stored the surrounding paragraph of a highlighted text, show it and make the highlighted text show as highlighted.
            if(!empty($note['BroaderText']) && $note['BroaderText'] != $note['SelectedText']){
                $TextWithContext = str_replace($note['SelectedText'],"<span style=\"background: yellow;\">".$note['SelectedText']."</span>",$note['BroaderText']);
            }

            // Keep some counters for commandline feedback
            if($j==0)$b++;
            $i++;
            $j++;

            // Put it in Evernote's ENEX format.
            $Body .='
    <note><title>'.($CappedText?$CappedText:$HighlightedText).'</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
    <en-note>
    <div>
    <p>'.($TextWithContext?$TextWithContext:$HighlightedText).'</p>
    <p><span style="color: rgb(169, 169, 169);font-size: 12px;">From chapter: '.$note['Chapter'].'</span></p>
    </div>
    <div>'.$note['Note'].'</div>
    </en-note>
    ]]></content><created>'.@strftime('%Y%m%dT%H%M%S',@strtotime("2001-01-01 +". ((int)$note['Created'])." seconds")).'</created><updated>'.@strftime('%Y%m%dT%H%M%S',@strtotime("2001-01-01 +". ((int)$note['Modified'])." seconds")).'</updated><tag>'.$BookTitle.'.</tag><note-attributes><author>joris@jor.is</author><source>desktop.mac</source><reminder-order>0</reminder-order></note-attributes></note>';

        }

        $Body .='
        </en-export>
        ';

        file_put_contents($BookTitle.".enex", $Body);
    }

    echo "Done! Exported $i notes into $b separate export files in the '".RESULT_DIRECTORY_NAME."' folder.\n\n";

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X