#!/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
```
"""