#!/usr/bin/env python3 """ # Script save-highlights # Metadata **Language**: #python **Parent**:: [[♯ Readwise]], [[Executable Markdown File]] # Synopsis Save highlights into Raindrop. # Script ```python #""" import os import urllib.parse import urllib.request import urllib.error import textwrap import json from pathlib import Path def format_url(url): return ( url.replace("(", "%28") .replace(")", "%29") .replace("'", "%27") .replace(",", "%2C") ) def post(data): # Convert data to JSON json_data = json.dumps(data).encode("utf-8") # Create a request object api_token = os.environ["RAINDROP_TOKEN"] req = urllib.request.Request( "https://api.raindrop.io/rest/v1/raindrop", headers={ "Authorization": f"Bearer {api_token}", "Content-Type": "application/json", }, data=json_data, method="POST", ) for _ in range(0, 10): try: urllib.request.urlopen(req) return except urllib.error.URLError: continue urllib.request.urlopen(req) def save(title): for dir in Path("robot/Readwise Library/").iterdir(): if not dir.is_dir(): continue path = dir / f"{title}.md" if not path.exists(): continue url = "https://kb.iany.me/" + str(path.as_posix())[:-3].replace( " ", "+" ).replace("%", "%25") with path.open() as fin: content = fin.read() original_url = None if "**URL**:: " in content: original_url = ( content.split("**URL**:: ")[1].split("(")[1].split(")")[0].strip() ) if original_url.startswith("<"): original_url = original_url[1:-1] highlights = textwrap.shorten( content.split("## Highlights")[1].strip(), width=2000, placeholder="..." ) if original_url is not None: extended = "\n\n".join([f"<{original_url}>", highlights]) else: extended = highlights payload = { "link": url, "title": title, "collection": { "$id": 54365583, }, "note": extended, "tags": ["from/readwise", "highlights", "from/obsidian-publish"], } print(f'save {payload["link"]}') post(payload) if original_url is not None: payload["link"] = original_url payload["title"] = title[: -len(" (Highlights)")] payload["note"] = f"""Highlights: <{url}>""" payload["tags"] = ["from/readwise", "highlighted"] print(f'save {payload["link"]}') post(payload) files = sorted( Path("robot/Readwise Library/Readwise Syncs/").glob("Readwise Sync *.md") ) if len(files) > 1: files = files[-1:] for file in files: with Path(file).open() as fin: index = fin.read() for line in index.splitlines(): if line.startswith("- ") and "[[" in line: title = line.split("[[")[1][:-2] save(title) """ # vim: ft=python ``` """