|
#!/usr/bin/env python3 |
|
|
|
# Required parameters: |
|
# @raycast.schemaVersion 1 |
|
# @raycast.title Add a new bookmark in Obsidian |
|
# @raycast.mode silent |
|
|
|
# Optional parameters: |
|
# @raycast.icon 🔖 |
|
# @raycast.argument1 { "type": "text", "placeholder": "URL" } |
|
|
|
# Documentation: |
|
# @raycast.author Huy Tran |
|
|
|
API_KEY = "<gemini api key>" |
|
BOOKMARK_FILE = "~/notes/Bookmarks.md" |
|
|
|
import sys |
|
import re |
|
from openai import OpenAI |
|
import google.generativeai as genai |
|
import requests |
|
import datetime |
|
|
|
def get_ordinal_suffix(day): |
|
if 10 <= day % 100 <= 20: |
|
suffix = 'th' |
|
else: |
|
suffix = {1: 'st', 2: 'nd', 3: 'rd'}.get(day % 10, 'th') |
|
return suffix |
|
|
|
def custom_strftime(format_string, date_obj): |
|
day = date_obj.day |
|
suffix = get_ordinal_suffix(day) |
|
return date_obj.strftime(format_string).replace('{S}', str(day) + suffix) |
|
|
|
today = datetime.date.today() |
|
formatted_date = custom_strftime("%A, %B {S} %Y", today) |
|
|
|
def get_text_from_url(url): |
|
try: |
|
response = requests.get(url) |
|
response.raise_for_status() # Raise an exception for bad status codes |
|
return response.text |
|
except requests.RequestException as e: |
|
return f"An error occurred: {e}" |
|
|
|
def generate_bookmark_content(url, with_summary): |
|
text = get_text_from_url(url) |
|
|
|
if not with_summary: |
|
match = re.search('<title>(.*?)</title>', text) |
|
title = match.group(1) if match else 'No title' |
|
return f"- {title} ({url})" |
|
|
|
prompt = f""" |
|
From this text, create a quick note entry to use as a bookmark in the following format, do not say anything else, and only use the provided content to generate: |
|
|
|
- <1 line description> (<url>) |
|
- <a brief summary with no more than 3 bullet points>" |
|
|
|
Here's the text content: |
|
|
|
--- |
|
URL: {url} |
|
TEXT CONTENT: |
|
{text} |
|
--- |
|
""" |
|
|
|
genai.configure(api_key=API_KEY) |
|
model = genai.GenerativeModel("gemini-1.5-flash") |
|
response = model.generate_content(prompt) |
|
output = response.text |
|
|
|
return output |
|
|
|
################################################## |
|
# PROCESS URL |
|
################################################## |
|
|
|
url = sys.argv[1] |
|
with_summary = True |
|
if url.startswith("!"): |
|
with_summary = False |
|
url = url.replace("!", "") |
|
|
|
output = generate_bookmark_content(url, with_summary) |
|
|
|
################################################## |
|
# WRITE FILE |
|
################################################## |
|
|
|
has_today_section = False |
|
with open(BOOKMARK_FILE, "r") as file: |
|
lines = file.readlines() |
|
for line in lines: |
|
if line.startswith("# ") and formatted_date in line: |
|
has_today_section = True |
|
break |
|
|
|
content_to_write = "" |
|
|
|
if not has_today_section: |
|
content_to_write = f"# {formatted_date}" |
|
|
|
content_to_write += f"\n{output}" |
|
|
|
with open(BOOKMARK_FILE, "a") as f: |
|
f.write(content_to_write) |
|
|
|
print("✅ Bookmarked!") |