Bagaimana cara saya mengumpulkan semua catatan dan sorotan saya dari iBooks?

14

Saya memiliki banyak highlighting dan catatan di iBooks yang telah saya baca, dan ingin dapat mengumpulkannya dalam satu format yang mudah digunakan dan memanipulasi (misalnya untuk menulis makalah dan mengutip kutipan).

Misalnya, saya ingin sorotan seperti ini

untuk menghasilkan sesuatu (misalnya, dalam CSV) seperti

Tolong saya beri saya nutrisi - yang menopang saya juga menghancurkan saya, 14, Tamburlane Bagian Satu dan Dua, Christopher Marlowe, Anthony B. Dawson ed., Bloomsbury, https://itun.es/us/qSrZ0.l

Saya dapat melihat bagaimana melakukan ini (semacam) dengan susah payah, satu catatan pada satu waktu, menggunakan fitur "berbagi" iBook (atau salin dan tempel, tentu saja) tapi saya tidak melihat cara untuk melakukannya secara massal, untuk semua catatan saya dari buku, atau bahkan semua buku saya.

Apakah ada cara untuk mencapai ini, dengan Apple Script atau menggunakan Automator misalnya? Atau mungkin ada teks atau file XML yang berisi catatan saya dan menyoroti bahwa saya bisa menulis skrip (dengan Python, lebih disukai) untuk menguraikan.

orome
sumber
Solusinya, ternyata, (seperti dalam banyak kasus), adalah meninggalkan Apple dan beralih ke Kindle, yang memiliki dukungan besar untuk mengekspor sorotan dan catatan.
orome

Jawaban:

11

iBooks tidak memiliki dukungan AppleScript. The penjelasan disimpan dalam file SQLite : ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/.

Anda bisa mencoba menguraikannya. Jawaban ini memberikan tautan ke Digested , yang membaca database itu dan kemudian memungkinkan Anda untuk mengekspor anotasi Anda ke Evernote, tetapi saya tidak tahu format apa yang akan mereka miliki atau jika Anda ingin mengacaukan dengan Evernote.

Salah satu (mungkin) solusi sederhana adalah dengan membuka buku di iBooks untuk iOS. Anda kemudian dapat mengirim email anotasi secara massal ke diri Anda sendiri.

  1. Buka buku
  2. Tekan "tombol daftar" untuk membuka Daftar Isi
  3. Beralih ke tab Notes
  4. Tekan tombol Bagikan
  5. Pilih Edit Catatan
  6. Pilih Semua
  7. Bagikan melalui email.

Edit:

Sebenarnya, setelah membaca komentar tentang reddit , sepertinya ada cara untuk mengekspor semuanya dari iBooks di OS X juga:

Anda dapat mengekspor catatan Anda dalam email dari Notes -> Pilih Semua -> Bagikan (Anda perlu menahan ctrl saat Anda mengklik kanan untuk mempertahankan pilihan Anda). Bagian Anda yang disorot akan disalin ke email dengan catatan Anda dan diformat dengan baik. Anehnya, di Mac aplikasi tidak peduli apakah buku itu dilindungi salinan — ia akan selalu menyalin bagian yang disorot. Aplikasi iOS memang diskriminatif. Jika buku Anda dilindungi salinan, maka hanya nama bab yang akan dibagikan. Sayangnya itu satu-satunya cara untuk melakukannya. : /

Menggunakan trackpad laptop saya, saya harus menahan ctrl + shiftsambil mengetuk trackpad untuk membuka menu kontekstual sambil mempertahankan pilihan.

fred
sumber
Ini sangat membantu. Saya masih jauh dari mendapatkan anotasi ke CSV atau bentuk lain yang mudah. Saya tidak bisa membuat apa-apa dari database SQL, dan surat, walaupun terlihat bagus, tidak dapat diakses secara program.
orome
Apakah hanya saya, atau apakah ini tidak mungkin lagi di versi baru iBooks? Saya tidak melihat tombol Edit Catatan lagi. Dalam hal apa, bagaimana cara mengekspor semua catatan saya?
incandescentman
@incandescentman Ada untuk saya di iOS 8.4.
fred
1
@incandescentman Langkah-langkah bernomor dalam jawaban saya di atas adalah untuk iOS. Bagian terakhir dari jawaban — bagian setelah "Edit" —adalah untuk OS X. Itu masih berfungsi untuk saya di Yosemite.
fred
2
Jadi, saya menggunakan el capitan sekarang, tetapi petunjuk dari komentar reddit itu masih bekerja untuk saya. Saya kira prosesnya sedikit berbeda tergantung pada apakah Anda menggunakan mouse atau trackpad. Menggunakan laptop tanpa keyboard / mouse eksternal, setelah saya memiliki komentar yang dipilih menggunakan pilih semua, saya kemudian tekan control + shift + ketuk pada trackpad. Itu memunculkan ini: tangkapan layar . Komentar di seluruh bab dipilih.
fred
3

Saya telah menulis skrip untuk tujuan ini yang mengekstrak catatan dari Mac Anda dan menampilkan file ekspor Evernote, siap untuk mengklik ganda. Mungkin Anda dapat memodifikasi skrip saya jika tidak sesuai dengan tujuan Anda dengan tepat.

Singkatnya, ini membaca database SQLite di: ./Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary ./Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotations

... dan dalam hal ini, ekspor mereka ke format .nex 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
sumber
3
  1. Instal DB Browser gratis untuk SQLite .
  2. Buka folder anotasi iBooks: ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/
  3. Salin .sqlitefile di suatu tempat (seperti Desktop) untuk menjaga keamanan aslinya.
  4. Buka file dengan Browser DB.
  5. Temukan beberapa catatan di buku target Anda dengan menjelajahi data.
  6. Saring oleh ZANNOTATIONASSETID untuk hanya menampilkan catatan di buku target.
  7. Salin dan tempel anotasi yang Anda inginkan ke dalam Angka atau aplikasi apa pun yang Anda inginkan.
Gavin
sumber
Kemudahan penggunaan Apple yang terkenal!
orome
@raxacoricofallapatorius: Serius. Itu beberapa omong kosong hanya untuk mendapatkan daftar kata-kata kosa kata yang saya soroti.
Gavin