2023-03-04 19:40:09 +00:00

59 lines
1.8 KiB
Python

"""Simple Reader that loads highlights from Readwise.io"""
import requests
import json
import datetime
from typing import List, Optional
from llama_index.readers.base import BaseReader
from llama_index.readers.schema.base import Document
def _get_readwise_data(api_key: str,
updated_after: Optional[datetime.datetime] = None):
"""
Uses Readwise's export API to export all highlights, optionally after a specified date.
See https://readwise.io/api_deets for details.
Args:
updated_after (datetime.datetime): The datetime to load highlights after. Useful for updating indexes over time.
"""
result = []
next_page = None
while True:
response = requests.get(
url="https://readwise.io/api/v2/export/",
params={
"pageCursor": next_page,
"updatedAfter": updated_after.isoformat() if updated_after else None
},
headers={"Authorization": f"Token {api_key}"})
response.raise_for_status()
result.extend(response.json()["results"])
next_page = response.json().get("nextPageCursor")
if not next_page: break
return result
class ReadwiseReader(BaseReader):
"""
Reader for Readwise highlights.
"""
def __init__(self, api_key: str):
self._api_key = api_key
def load_data(
self,
updated_after: Optional[datetime.datetime] = None,
) -> List[Document]:
"""
Load your Readwise.io highlights.
Args:
updated_after (datetime.datetime): The datetime to load highlights after. Useful for updating indexes over time.
"""
readwise_response = _get_readwise_data(api_key=self._api_key,
updated_after=updated_after)
result = [Document(json.dumps(d)) for d in readwise_response]
return result