¿Cómo recopilo todas mis notas y destacados de iBooks?

14

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

Por ejemplo, me gustaría un resaltado 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 (un poco) laboriosamente, una nota a la vez, usando la función de "compartir" de iBook (o copiar y pegar, por supuesto) pero no veo ninguna forma de hacerlo en masa, para todos de mis notas de un libro, o incluso todos mis libros.

¿Hay alguna manera de lograr esto, con un Apple Script o usando Automator, por ejemplo? O tal vez haya un archivo de texto o XML que contenga mis notas y resalte que podría escribir un script (en Python, preferiblemente) para analizar.

orome
fuente
Resulta que la solución (como en muchos casos) es dejar atrás a Apple y cambiar a Kindle, que tiene un gran soporte para exportar notas y notas destacadas.
orome

Respuestas:

11

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

Podrías intentar analizar eso. Esta respuesta da un enlace a Digested , que lee esa base de datos y luego le permite exportar sus anotaciones a Evernote, pero no sé qué formato tendrán o si desea meterse con Evernote.

Una (posiblemente) solución simple sería abrir el libro en iBooks para iOS. Luego, puede enviar por correo electrónico las anotaciones en masa para usted.

  1. Abra el libro
  2. Presione el "botón de lista" para que aparezca la Tabla de contenido
  3. Cambie a la pestaña Notas
  4. Presione el botón Compartir
  5. Seleccione Editar notas
  6. Seleccionar todo
  7. Compartir via correo electrónico.

Editar:

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

Puede exportar sus notas en un correo electrónico desde Notas -> Seleccionar todo -> Compartir (debe mantener presionada la tecla Ctrl mientras hace clic derecho para conservar su selección). Sus porciones resaltadas se copiarán en el correo electrónico con sus notas y se formatearán muy bien. Curiosamente, en Mac, a la aplicación no le importa si el libro está protegido contra copia, siempre copiará la parte resaltada. Sin embargo, la aplicación iOS discrimina. Si su libro está protegido contra copia, solo se compartirá el nombre del capítulo. Desafortunadamente, esa parece ser la única forma de hacerlo. : /

Usando el trackpad de mi computadora portátil, tuve que mantener presionado ctrl + shiftmientras tocaba el trackpad para abrir el menú contextual mientras se conservaba la selección.

Fred
fuente
Esto es muy útil. Sin embargo, todavía estoy muy lejos de obtener las anotaciones en un CSV u otra forma conveniente. No puedo sacar nada de la base de datos SQL, y el correo, si bien se ve bien, no es accesible mediante programación.
orome
¿Soy solo yo o ya no es posible en la nueva versión de iBooks? Ya no veo el botón Editar notas. En cuyo caso, ¿cómo exporto todas mis notas?
incandescentman
@incandescentman Está ahí para mí en iOS 8.4.
fred
1
@incandescentman Los pasos numerados en mi respuesta anterior fueron para iOS. La última parte de la respuesta, la sección después de "Editar", es para OS X. Eso todavía funciona para mí en Yosemite.
fred
2
Entonces, estoy en el capitan ahora, pero las instrucciones de ese comentario de reddit todavía funcionan para mí. Supongo que el proceso difiere ligeramente dependiendo de si estás usando un mouse o un trackpad. Usando la computadora portátil sin un teclado / mouse externo, después de haber seleccionado los comentarios usando seleccionar todo, luego presiono control + shift + toque en el panel táctil. Eso trae a colación esto: captura de pantalla . Se seleccionan los comentarios en los capítulos.
Fred
3

He escrito un script para este propósito que extrae las notas de su Mac y genera archivos de exportación de Evernote, listos para hacer doble clic. Quizás podría modificar mi script si no se ajusta a sus propósitos con precisión.

En resumen, lee las bases de datos SQLite en: ./Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary ./Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotations

... 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 <[email protected]>
     *  
     *  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>[email protected]</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";
jorisw
fuente
3
  1. Instale el navegador DB gratuito para SQLite .
  2. Vaya a la carpeta de anotaciones de iBooks: ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/
  3. Copie el .sqlitearchivo en algún lugar (como Escritorio) para mantener el original seguro.
  4. Abra el archivo con DB Browser.
  5. Encuentre algunas notas en su libro objetivo navegando por los datos.
  6. Filtre por el ZANNOTATIONASSETID para mostrar solo notas en el libro de destino.
  7. Copie y pegue las anotaciones que desee en Numbers o en la aplicación que prefiera.
Gavin
fuente
¡La famosa facilidad de uso de Apple!
orome
@raxacoricofallapatorius: En serio. Es un poco de rigmarole solo para obtener una lista de las palabras de vocabulario que destaqué.
Gavin