Jak zebrać wszystkie swoje notatki i najważniejsze informacje z iBooks?

15

Mam wiele wyróżnień i notatek w iBookach, które przeczytałem i chciałbym móc je zbierać w jednym łatwym w użyciu i manipulowaniu formacie (np. Do pisania artykułów i cytowania cytatów).

Na przykład chciałbym taką atrakcję

wyprodukować coś (np. w CSV) jak

Quod me nutrit me destruit - to, co mnie podtrzymuje, niszczy mnie również, 14, Tamburlane Part One and Two, Christopher Marlowe, Anthony B. Dawson ed., Bloomsbury, https://itun.es/us/qSrZ0.l

Widzę, jak to robić (w pewnym sensie) pracochłonnie, pojedynczo, za pomocą funkcji „udostępniania” iBooka (lub oczywiście kopiowania i wklejania), ale nie widzę żadnego sposobu, aby zrobić to zbiorczo, dla wszystkich moich notatek z książki, a nawet wszystkich moich książek.

Czy istnieje sposób na osiągnięcie tego celu, na przykład za pomocą skryptu Apple lub za pomocą Automatora? A może jest plik tekstowy lub XML zawierający moje notatki i podkreślający, że mógłbym napisać skrypt (najlepiej w języku Python) do analizy.

orome
źródło
Okazuje się, że rozwiązaniem (jak w wielu przypadkach) jest pozostawienie Apple'a i przejście na Kindle, który ma świetne wsparcie dla eksportowania najważniejszych wydarzeń i notatek.
orome

Odpowiedzi:

11

iBooks nie obsługuje AppleScript. Te adnotacje są zapisywane w pliku SQLite : ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/.

Możesz spróbować to przeanalizować. Ta odpowiedź zawiera link do Digested , który odczytuje tę bazę danych, a następnie pozwala wyeksportować swoje adnotacje do Evernote, ale nie wiem, jakie będą mieć formatowanie lub czy chcesz zadzierać z Evernote.

Jednym (prawdopodobnie) prostym rozwiązaniem byłoby otwarcie książki w iBooks na iOS. Następnie możesz wysłać e-mailem adnotacje do siebie.

  1. Otwórz książkę
  2. Naciśnij „przycisk listy”, aby wyświetlić Spis treści
  3. Przejdź na kartę Notatki
  4. Naciśnij przycisk Udostępnij
  5. Wybierz Edytuj notatki
  6. Zaznacz wszystko
  7. Udostępnij przez e-mail.

Edytować:

W rzeczywistości po przeczytaniu komentarza do reddit wydaje się, że istnieje sposób na wyeksportowanie ich wszystkich z iBooks na OS X:

Możesz wyeksportować swoje notatki w wiadomości e-mail z Notatki -> Wybierz wszystko -> Udostępnij (musisz przytrzymać klawisz Ctrl podczas kliknięcia prawym przyciskiem myszy, aby zachować swój wybór). Wyróżnione fragmenty zostaną skopiowane do wiadomości e-mail z notatkami i ładnie sformatowane. O dziwo, na Macu aplikacja nie dba o to, czy książka jest chroniona przed kopiowaniem - zawsze kopiuje podświetloną część. Jednak aplikacja na iOS rzeczywiście dyskryminuje. Jeśli książka jest zabezpieczona przed kopiowaniem, tylko nazwa rozdziału będzie udostępniona. Niestety wydaje się, że jest to jedyny sposób. : /

Korzystając z gładzika laptopa, musiałem przytrzymać przycisk, ctrl + shiftdotykając gładzika, aby wyświetlić menu kontekstowe, zachowując wybór.

Fred
źródło
To jest bardzo pomocne. Nadal jestem daleko od umieszczenia adnotacji w pliku CSV lub innej wygodnej formie. Nie mogę zrobić niczego z bazy danych SQL, a poczta, chociaż ładnie wyglądająca, nie jest dostępna programowo.
orome
Czy to tylko ja, czy nie jest to już możliwe w nowej wersji iBooks? Nie widzę już przycisku Edytuj notatki. W takim przypadku, jak wyeksportować wszystkie moje notatki?
incandescentman
@incandescentman Jest dla mnie w iOS 8.4.
fred
1
@incandescentman Numerowane kroki w mojej powyższej odpowiedzi dotyczyły systemu iOS. Ostatnia część odpowiedzi - sekcja po „Edycji” - dotyczy systemu OS X. To nadal działa dla mnie w Yosemite.
fred
2
Więc jestem teraz na el capitan, ale wskazówki z tego komentarza reddit nadal działają dla mnie. Myślę, że proces różni się nieznacznie w zależności od tego, czy używasz myszy, czy gładzika. Używając laptopa bez zewnętrznej klawiatury / myszy, po wybraniu komentarzy za pomocą zaznacz wszystko, a następnie naciśnij klawisze Control + Shift + Stuknij gładzik. To powoduje: zrzut ekranu . Wybrano komentarze w poszczególnych rozdziałach.
fred
3

Napisałem w tym celu skrypt, który wyodrębnia notatki z komputera Mac i wyświetla pliki eksportu Evernote, gotowe do dwukrotnego kliknięcia. Być może mógłbyś zmodyfikować mój skrypt, jeśli nie odpowiada on dokładnie twoim celom.

W skrócie, czyta bazy danych SQLite w: ./Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary ./Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotations

... iw tym przypadku eksportuje je do formatu .enex 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
źródło
3
  1. Zainstaluj darmową przeglądarkę DB dla SQLite .
  2. Przejdź do folderu adnotacji iBooks: ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/
  3. Skopiuj .sqliteplik gdzieś (np. Desktop), aby zachować oryginał.
  4. Otwórz plik za pomocą DB Browser.
  5. Znajdź notatki w książce docelowej, przeglądając dane.
  6. Filtruj według ZANNOTATIONASSETID, aby wyświetlić tylko notatki w książce docelowej.
  7. Skopiuj i wklej adnotacje do Numbers lub dowolnej innej aplikacji.
Gavin
źródło
Słynna łatwość obsługi Apple!
orome
@raxacoricofallapatorius: Poważnie. To jest trochę rygorystyczne, aby uzyskać listę słów, które podkreśliłem.
Gavin,