Comment collecter toutes mes notes et surlignages sur iBooks?

14

J'ai beaucoup de surlignages et de notes dans les iBooks que j'ai lus, et j'aimerais pouvoir les collecter dans un format facile à utiliser et à manipuler (par exemple pour écrire des articles et citer des citations).

Par exemple, je voudrais un point culminant comme celui-ci

pour produire quelque chose (par exemple, en CSV) comme

Quod me nutrit me destruit - ce qui me soutient me détruit aussi, 14, Tamburlane Parts One and Two, Christopher Marlowe, Anthony B. Dawson ed., Bloomsbury, https://itun.es/us/qSrZ0.l

Je peux voir comment faire cela (en quelque sorte) laborieusement, une note à la fois, en utilisant la fonction de «partage» d'iBook (ou copier et coller, bien sûr), mais je ne vois aucun moyen de le faire en bloc, pour tous de mes notes d'un livre, ou même tous mes livres.

Existe-t-il un moyen d'y parvenir, avec un script Apple ou en utilisant Automator par exemple? Ou peut-être existe-t-il un fichier texte ou XML contenant mes notes et soulignant que je pourrais écrire un script (en Python, de préférence) à analyser.

orome
la source
Il s'avère que la solution (comme dans de nombreux cas) est de laisser Apple derrière et de passer au Kindle, qui offre un excellent support pour l'exportation des surlignages et des notes.
orome

Réponses:

11

iBooks ne prend pas en charge AppleScript. Les annotations sont stockées dans un fichier SQLite : ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/.

Vous pouvez essayer d'analyser cela. Cette réponse donne un lien vers Digested , qui lit cette base de données et vous permet ensuite d'exporter vos annotations vers Evernote, mais je ne sais pas quel format ils auront ou si vous voulez jouer avec Evernote.

Une solution (éventuellement) simple serait d'ouvrir le livre dans iBooks pour iOS. Vous pouvez ensuite vous envoyer les annotations en masse.

  1. Ouvrir le livre
  2. Appuyez sur le "bouton de liste" pour afficher la table des matières
  3. Passer à l'onglet Notes
  4. Appuyez sur le bouton Partager
  5. Sélectionnez Modifier les notes
  6. Tout sélectionner
  7. Partagez par e-mail.

Éditer:

En fait, après avoir lu un commentaire sur reddit , il semble y avoir un moyen de les exporter tous à partir d'iBooks sur OS X:

Vous pouvez exporter vos notes dans un e-mail à partir de Notes -> Sélectionner tout -> Partager (vous devez maintenir la touche Ctrl enfoncée pendant que vous cliquez avec le bouton droit pour conserver votre sélection). Vos parties en surbrillance seront copiées dans l'e-mail avec vos notes et bien formatées. Étrangement, sur Mac, l'application ne se soucie pas de savoir si le livre est protégé contre la copie, il copiera toujours la partie en surbrillance. Cependant, l'application iOS est discriminatoire. Si votre livre est protégé contre la copie, seul le nom du chapitre sera partagé. Cela semble malheureusement être le seul moyen de le faire. : /

À l'aide du trackpad de mon ordinateur portable, j'ai dû maintenir ctrl + shiftla touche enfoncée tout en appuyant sur le trackpad afin d'afficher le menu contextuel tout en conservant la sélection.

Fred
la source
C'est très utile. Je suis encore loin d'avoir les annotations dans un CSV ou un autre formulaire pratique. Je ne peux rien faire de la base de données SQL, et le courrier, bien qu'il soit joli, n'est pas accessible par programme.
orome
Est-ce juste moi ou n'est-ce plus possible dans la nouvelle version d'iBooks? Je ne vois plus de bouton Modifier les notes. Dans ce cas, comment exporter toutes mes notes?
incandescentman
@incandescentman C'est là pour moi dans iOS 8.4.
Fred
1
@incandescentman Les étapes numérotées dans ma réponse ci-dessus étaient pour iOS. La dernière partie de la réponse - la section après «Modifier» - est pour OS X. Cela fonctionne toujours pour moi sur Yosemite.
fred
2
Donc, je suis sur el capitan maintenant, mais les instructions de ce commentaire reddit fonctionnent toujours pour moi. Je suppose que le processus diffère légèrement selon que vous utilisez une souris ou un trackpad. En utilisant l'ordinateur portable sans clavier / souris externe, après avoir sélectionné les commentaires en utilisant Tout sélectionner, j'appuie ensuite sur Ctrl + Maj + Tap sur le trackpad. Cela amène ceci: capture d'écran . Les commentaires des chapitres sont sélectionnés.
fred
3

J'ai écrit un script à cet effet qui extrait les notes de votre Mac et génère des fichiers d'exportation Evernote, prêts à double-cliquer. Vous pourriez peut-être modifier mon script s'il ne correspond pas précisément à vos objectifs.

En bref, il lit les bases de données SQLite dans: ./Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary ./Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotations.

... et dans ce cas, les exporte au format .enex d'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
la source
3
  1. Installez le navigateur DB gratuit pour SQLite .
  2. Accédez au dossier d'annotations iBooks: ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/
  3. Copiez le .sqlitefichier quelque part (comme le bureau) pour conserver le coffre-fort d'origine.
  4. Ouvrez le fichier avec DB Browser.
  5. Trouvez des notes dans votre livre cible en parcourant les données.
  6. Filtrez par le ZANNOTATIONASSETID pour afficher uniquement les notes dans le livre cible.
  7. Copiez et collez les annotations souhaitées dans Numbers ou dans l'application que vous préférez.
Gavin
la source
Célèbre facilité d'utilisation d'Apple!
orome
@raxacoricofallapatorius: Sérieusement. C'est un peu de rigueur juste pour obtenir une liste des mots de vocabulaire que j'ai mis en évidence.
Gavin