""" Demo Orger adapter for Pocket data. For documentation purposes, so please modify pocket.py if you want to contribute. """ """ First we define some abstractions for Pocket entities (articles and highlights). While it's not that necessary and for one script you can get away with using json directly, it does help to separate parsing and rendering, allows you to reuse parsing for other projects and generally makes everything clean. Also see https://github.com/karlicoss/HPI package for some inspiration. """ from datetime import datetime from pathlib import Path from typing import NamedTuple, Sequence, Any class Highlight (NamedTuple): """ Abstract representation of Pocket highlight """ json: Any @property def text ( self ) -> str : return self .json[ 'quote' ] @property def created ( self ) -> datetime: return datetime.strptime( self .json[ 'created_at' ], '%Y-%m-%d %H:%M:%S' ) class Article (NamedTuple): """ Abstract representation of Pocket saved page """ json: Any @property def url ( self ) -> str : return self .json[ 'given_url' ] @property def title ( self ) -> str : return self .json[ 'given_title' ] @property def pocket_link ( self ) -> str : return 'https://app.getpocket.com/read/' + self .json[ 'item_id' ] @property def added ( self ) -> datetime: return datetime.fromtimestamp( int ( self .json[ 'time_added' ])) @property def highlights ( self ) -> Sequence[Highlight]: raw = self .json.get( 'annotations' , []) return list ( map (Highlight, raw)) def get_articles (json_path: Path) -> Sequence[Article]: """ Parses Pocket export produced by https://github.com/karlicoss/pockexport """ import json raw = json.loads(json_path.read_text())[ 'list' ] return list ( map (Article, raw.values())) """ Ok, now we can get to implementing the adapter. """ from orger import Mirror """ Mirror means it's meant to be read-only view onto data (as opposed to Queue). """ from orger.inorganic import node, link from orger.common import dt_heading class Pocket (Mirror): def get_items ( self ): """ get_items returns a sequence/iterator of nodes see orger.inorganic.OrgNode to find out about attributes you can use """ export_file = self .cmdline_args. file for a in get_articles(export_file): yield node( heading=dt_heading( a.added, link(title= 'pocket' , url=a.pocket_link) + ' · ' + link(title=a.title, url=a.url), ), children=[node( heading=dt_heading(hl.created, hl.text) ) for hl in a.highlights] ) def setup_parser (p): """ Optional hooks for extra arguments if you need them in your adapter """ p.add_argument( '--file' , type =Path, help = 'JSON file from API export' , required= True ) if __name__ == '__main__' : """ Usage example: ./pocket.py --file /backups/pocket/last-backup.json --to /data/orger/pocket.org """ Pocket.main(setup_parser=setup_parser) """ Example pocket.org output: # AUTOGENERATED BY /L/zzz_syncthing/coding/orger/pocket.py * [2018-07-09 Mon 10:56] [[https://app.getpocket.com/read/1949330650][pocket]] · [[https://www.gwern.net/Complexity-vs-AI][Complexity no Bar to AI - Gwern.net]] ** [2019-09-22 Sun 03:36] iving up determinism and using randomized algorithms which are faster but may not return an answer or a correct answer1 ** [2019-06-22 Sat 16:48] The apparent barrier of a complex problem can be bypassed by (in * [2016-10-21 Fri 14:42] [[https://app.getpocket.com/read/1407671000][pocket]] · [[https://johncarlosbaez.wordpress.com/2016/09/09/struggles-with-the-continuum-part-2/][Struggles with the Continuum (Part 2) | Azimuth]] * [2016-05-31 Tue 18:25] [[https://app.getpocket.com/read/1042711293][pocket]] · [[http://www.scottaaronson.com/blog/?p=2464][Bell inequality violation finally done right]] * [2016-05-31 Tue 18:24] [[https://app.getpocket.com/read/1188624587][pocket]] · [[https://packetzoom.com/blog/how-to-test-your-app-in-different-network-conditions.html][How to test your app in different network conditions -]] * [2016-05-31 Tue 18:24] [[https://app.getpocket.com/read/1191143185][pocket]] · [[http://www.schibsted.pl/2016/02/hood-okhttps-cache/][What's under the hood of the OkHttp's cache?]] * [2016-03-15 Tue 17:27] [[https://app.getpocket.com/read/1187239791][pocket]] · [[http://joeduffyblog.com/2016/02/07/the-error-model/][Joe Duffy - The Error Model]] ** [2019-09-25 Wed 18:20] A bug is a kind of error the programmer didn’t expect. Inputs weren’t validated correctly, logic was written wrong, or any host of problems have arisen. ** [2019-09-25 Wed 18:19] First, throwing an exception is usually ridiculously expensive. This is almost always due to the gathering of a stack trace. ** [2019-09-25 Wed 18:20] In other words, an exception, as with error codes, is just a different kind of return value! """