Как мне собрать все свои заметки и заметки из iBooks?

14

У меня есть много выделений и заметок в iBooks, которые я прочитал, и хотел бы иметь возможность собирать их в одном простом в использовании и манипулировать формате (например, для написания статей и цитирования цитат).

Например, я хотел бы выделить такой

производить что-то (например, в CSV), как

Quod me nutrit me destruit - то, что поддерживает меня, также уничтожает меня, 14, части 1 и 2 тамбурлана, Кристофер Марлоу, ред. Энтони Б. Доусон, Bloomsbury, https://itun.es/us/qSrZ0.l

Я вижу, как сделать это (вроде) кропотливо, по одной заметке за раз, с помощью функции «обмена» iBook (или, конечно, скопировать и вставить), но я не вижу способа сделать это навалом, для всех моих заметок из книги или даже всех моих книг.

Есть ли способ сделать это, например, с помощью Apple Script или с помощью Automator? Или, может быть, есть текстовый или XML-файл, содержащий мои заметки и выделение, которые я мог бы написать для анализа (предпочтительно на Python).

Оромэ
источник
Оказывается, решение (как и во многих случаях) состоит в том, чтобы оставить Apple позади и переключиться на Kindle, которая имеет отличную поддержку для экспорта основных моментов и заметок.
Оромэ

Ответы:

11

В iBooks отсутствует поддержка AppleScript. В аннотации хранятся в SQLite файла : ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/.

Вы можете попытаться разобрать это. В этом ответе дается ссылка на Digested , который читает эту базу данных, а затем позволяет вам экспортировать свои аннотации в Evernote, но я не знаю, какое у них будет форматирование или вы хотите связываться с Evernote.

Одно (возможно) простое решение - открыть книгу в iBooks для iOS. Затем вы можете отправить аннотации по электронной почте.

  1. Открыть книгу
  2. Нажмите «кнопку списка», чтобы открыть оглавление
  3. Переключиться на вкладку «Заметки»
  4. Нажмите кнопку Поделиться
  5. Выберите Редактировать заметки
  6. Выбрать все
  7. Поделиться по электронной почте.

Редактировать:

На самом деле, после прочтения комментария на Reddit , кажется, есть способ экспортировать их все из iBooks на OS X:

Вы можете экспортировать свои заметки в электронном письме из Заметок -> Выбрать все -> Поделиться (вам нужно удерживать Ctrl, пока вы щелкаете правой кнопкой мыши, чтобы сохранить свой выбор). Ваши выделенные части будут скопированы в электронное письмо с вашими заметками и красиво отформатированы. Как ни странно, на Mac приложение не заботится о том, защищена ли книга от копирования - оно всегда будет копировать выделенную часть. Приложение iOS действительно различает все же. Если ваша книга защищена от копирования, то будет опубликовано только название главы. Это, кажется, единственный способ сделать это, к сожалению. : /

Используя трекпад моего ноутбука, я должен был удерживать его нажатым ctrl + shift, чтобы вызвать контекстное меню при сохранении выбора.

Фред
источник
Это очень полезно. Я все еще далеко от получения аннотаций в CSV или другой удобной форме. Я ничего не могу сделать из базы данных SQL, и почта, хотя и выглядит красиво, программно недоступна.
orome
Это только я, или это больше невозможно в новой версии iBooks? Я больше не вижу кнопку «Редактировать заметки». В каком случае, как мне экспортировать все мои заметки?
Лампа накаливания
@incandescentman Это для меня в iOS 8.4.
Фред
1
@incandescentman Пронумерованные шаги в моем ответе выше были для iOS. Последняя часть ответа - раздел после «Правка» - для OS X. Это все еще работает для меня на Yosemite.
Фред
2
Итак, я сейчас на эль-капитане, но указания из этого комментария Reddit все еще работают для меня. Я думаю, что процесс немного отличается в зависимости от того, используете ли вы мышь или трекпад. Используя ноутбук без внешней клавиатуры / мыши, после того, как я выбрал комментарии, используя select all, я затем нажимаю control + shift + tap на трекпаде. Это поднимает это: скриншот . Комментарии по главам выбраны.
Фред
3

Для этой цели я написал скрипт, который извлекает заметки с вашего Mac и выводит файлы экспорта Evernote, готовые для двойного щелчка. Возможно, вы могли бы изменить мой сценарий, если он не соответствует вашим целям.

Короче говоря, он читает базы данных SQLite в: ./Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary ./Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotations

... и в этом случае экспортирует их в формат Evernote .enex.

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";
jorisw
источник
3
  1. Установите бесплатный браузер БД для SQLite .
  2. Перейдите в папку аннотаций iBooks: ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/
  3. Скопируйте .sqliteфайл куда-нибудь (например, Desktop), чтобы сохранить оригинал в безопасности.
  4. Откройте файл с помощью DB Browser.
  5. Найдите некоторые заметки в вашей целевой книге, просматривая данные.
  6. Фильтруйте по ZANNOTATIONASSETID, чтобы показывать только заметки в целевой книге.
  7. Скопируйте и вставьте нужные комментарии в Numbers или в любое другое приложение.
Gavin
источник
Знаменитая простота использования Apple!
ором
@raxacoricofallapatorius: Серьезно. Это какая-то странность, чтобы получить список слов, которые я выделил.
Гэвин