Initial Commit
This commit is contained in:
Executable
+120
@@ -0,0 +1,120 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Required Raycast metadata parameters:
|
||||
# @raycast.schemaVersion 1
|
||||
# @raycast.title Push Clipboard to Paperless
|
||||
# @raycast.mode silent
|
||||
# @raycast.packageName Automation
|
||||
# @raycast.icon 📄
|
||||
|
||||
# 1. Configuration
|
||||
API_URL="http://paperlss.duckdns.org:8008/api/documents/post_document/"
|
||||
API_TOKEN="aee0db3c33917f4f68e07045c660b156eb2da0d4"
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
DISPLAY_DATE=$(date "+%Y-%m-%d %H:%M:%S")
|
||||
|
||||
# 2. Check if the clipboard contains an image first
|
||||
HAS_IMAGE=$(osascript -e 'clipboard info' 2>/dev/null | grep -E "TIFF picture|PNG picture|JPEG picture")
|
||||
|
||||
if [ -n "$HAS_IMAGE" ]; then
|
||||
TMP_IMG=$(mktemp).png
|
||||
osascript -e "write (the clipboard as «class PNGf») to (open for access POSIX file \"$TMP_IMG\" with write permission)" >/dev/null 2>&1
|
||||
|
||||
if [ ! -f "$TMP_IMG" ] || [ ! -s "$TMP_IMG" ]; then
|
||||
echo "❌ Image extraction failed"
|
||||
rm -f "$TMP_IMG"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-H "Authorization: Token $API_TOKEN" \
|
||||
-F "document=@${TMP_IMG};filename=clip_${TIMESTAMP}.png" \
|
||||
-F "title=Clipboard Image ($DISPLAY_DATE)" \
|
||||
"$API_URL")
|
||||
|
||||
rm -f "$TMP_IMG"
|
||||
|
||||
if [ "$STATUS_CODE" -eq 200 ] || [ "$STATUS_CODE" -eq 201 ]; then
|
||||
echo "🖼️ Sent image to Paperless!"
|
||||
exit 0
|
||||
else
|
||||
echo "❌ Image upload failure (HTTP $STATUS_CODE)"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 3. Fallback: Process text by rendering directly to a full-length PNG image using Pillow
|
||||
CLIP_TEXT=$(pbpaste)
|
||||
|
||||
if [ -z "$CLIP_TEXT" ]; then
|
||||
echo "❌ Clipboard is empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TMP_PNG=$(mktemp).png
|
||||
|
||||
# Generate a high-resolution, single continuous image stream from text strings
|
||||
python3 - <<EOF "$CLIP_TEXT" "$TMP_PNG"
|
||||
import sys
|
||||
import textwrap
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
text = sys.argv[1]
|
||||
output_path = sys.argv[2]
|
||||
|
||||
raw_lines = text.splitlines()
|
||||
wrapped_lines = []
|
||||
|
||||
# Map raw text while fully maintaining paragraph returns and empty spacers
|
||||
for line in raw_lines:
|
||||
if not line.strip():
|
||||
wrapped_lines.append("")
|
||||
else:
|
||||
wrapped_lines.extend(textwrap.wrap(line, width=90))
|
||||
|
||||
font_size = 14
|
||||
line_height = 18
|
||||
padding = 40
|
||||
|
||||
try:
|
||||
font = ImageFont.truetype("Courier", font_size)
|
||||
except IOError:
|
||||
font = ImageFont.load_default()
|
||||
|
||||
width = 850
|
||||
height = (len(wrapped_lines) * line_height) + (padding * 2)
|
||||
|
||||
# Instantiate scalable graphic asset layout block
|
||||
img = Image.new("RGB", (width, height), color="white")
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
# Print lines systematically down the image frame coordinates
|
||||
y = padding
|
||||
for line in wrapped_lines:
|
||||
draw.text((padding, y), line, fill="black", font=font)
|
||||
y += line_height
|
||||
|
||||
img.save(output_path, "PNG")
|
||||
EOF
|
||||
|
||||
if [ ! -f "$TMP_PNG" ] || [ ! -s "$TMP_PNG" ]; then
|
||||
echo "❌ Image processing failed"
|
||||
rm -f "$TMP_PNG"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 4. Stream upload generated image straight to Paperless-ngx instance
|
||||
STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-H "Authorization: Token $API_TOKEN" \
|
||||
-F "document=@${TMP_PNG};filename=clip_${TIMESTAMP}.png" \
|
||||
-F "title=Clipboard Snippet ($DISPLAY_DATE)" \
|
||||
"$API_URL")
|
||||
|
||||
rm -f "$TMP_PNG"
|
||||
|
||||
if [ "$STATUS_CODE" -eq 200 ] || [ "$STATUS_CODE" -eq 201 ]; then
|
||||
echo "📄 Sent snippet image to Paperless!"
|
||||
else
|
||||
echo "❌ API Failure (HTTP $STATUS_CODE)"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user